diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2570e67ccaeea1c0ce0e77cfb462e24bf95d61ef..6d79ea7c27b10f4daeb3c921ea92c43ba3702555 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -250,6 +250,7 @@ endif()
 #########################
 set(CHAMELEON_DEP "")
 
+set(CHAMELEON_USE_LIBHQR 1)
 find_package(LIBHQR REQUIRED)
 list(INSERT CHAMELEON_DEP 0 ${LIBHQR_LIBRARIES})
 include_directories(${LIBHQR_INCLUDE_DIRS})
diff --git a/compute/CMakeLists.txt b/compute/CMakeLists.txt
index 763902b18f69cb3ce4337695abfbca144aab84c3..0fa6dfb80f8ac02d321a1ee1b11aa0ad7e4baeaf 100644
--- a/compute/CMakeLists.txt
+++ b/compute/CMakeLists.txt
@@ -105,7 +105,7 @@ set(ZSRC
     pzgelqfrh.c
     pzgeqrf.c
     pzgeqrfrh.c
-    pzgeqrfhqr.c
+    pzgeqrf_param.c
     pzgetrf_incpiv.c
     pzgetrf_nopiv.c
     pzlacpy.c
@@ -138,6 +138,7 @@ set(ZSRC
     zgelqf.c
     zgelqs.c
     zgeqrf.c
+    zgeqrf_param.c
     zgeqrs.c
     #zgesv.c
     zgesv_incpiv.c
diff --git a/compute/pzgeqrfhqr.c b/compute/pzgeqrf_param.c
similarity index 72%
rename from compute/pzgeqrfhqr.c
rename to compute/pzgeqrf_param.c
index 1f3c88ace1cda39ca76c9fbdf491c4c14228daf6..0d528ef2d6ea9412ec62cc8319cc6f84308458e1 100644
--- a/compute/pzgeqrfhqr.c
+++ b/compute/pzgeqrf_param.c
@@ -9,7 +9,7 @@
 
 /**
  *
- * @file pzgeqrfhqr.c
+ * @file pzgeqrf_param.c
  *
  *  MORSE auxiliary routines
  *  MORSE is a software package provided by Univ. of Tennessee,
@@ -30,26 +30,26 @@
 #include "control/common.h"
 #include "libhqr.h"
 
-#define A(m,n) A,  (m),  (n)
-#define TS(m,n) TS,  (m),  (n)
-#define TT(m,n) TT,  (m), (n)
+#define A(m,n)  A,  (m), (n)
+#define TS(m,n) TS, (m), (n)
+#define TT(m,n) TT, (m), (n)
 #if defined(CHAMELEON_COPY_DIAG)
-#define DIAG(m,n) DIAG, (m), (n)
+#define D(m,n)  D,  (m), (n)
 #else
-#define DIAG(m,n) A,  (m),  (n)
+#define D(m,n)  A,  (m), (n)
 #endif
 
-/***************************************************************************//**
-                                                                              *  Parallel tile QR factorization (reduction Householder) - dynamic scheduling
-                                                                              **/
-void morse_pzgeqrfhqr( const libhqr_tree_t *qrtree, MORSE_desc_t *A, MORSE_desc_t *TS, MORSE_desc_t *TT,
-                      MORSE_sequence_t *sequence, MORSE_request_t *request)
+/**
+ *  Parallel tile QR factorization (reduction Householder) - dynamic scheduling
+ */
+void morse_pzgeqrf_param( const libhqr_tree_t *qrtree, MORSE_desc_t *A, MORSE_desc_t *TS, MORSE_desc_t *TT,
+                          MORSE_sequence_t *sequence, MORSE_request_t *request)
 {
     MORSE_context_t *morse;
     MORSE_option_t options;
     size_t ws_worker = 0;
     size_t ws_host = 0;
-    MORSE_desc_t *DIAG = NULL;
+    MORSE_desc_t *D = NULL;
 
     int k, m, n, i, j, p;
     int K, M, RD;
@@ -90,23 +90,6 @@ void morse_pzgeqrfhqr( const libhqr_tree_t *qrtree, MORSE_desc_t *A, MORSE_desc_
     tiles = (int*)malloc((qrtree->mt)*sizeof(int));
     memset( tiles, 0, (qrtree->mt)*sizeof(int) );
 
-#if defined(CHAMELEON_USE_MAGMA)
-    /* Worker space
-     *
-     * zgeqrt = max( A->nb * (ib+1), ib * (ib + A->nb) )
-     * ztsqrt = max( A->nb * (ib+1), ib * (ib + A->nb) )
-     */
-    ws_worker = chameleon_max( ws_worker, ib * (ib + A->nb) );
-
-    /* Host space
-     *
-     * zgeqrt = ib * (A->nb+3*ib) + A->nb )
-     * ztsqrt = 2 * ib * (A->nb+ib) + A->nb
-     */
-    ws_host = chameleon_max( ws_host, ib * (A->mb + 3 * ib) + A->mb );
-    ws_host = chameleon_max( ws_host,  2 * ib * (A->nb + ib) + A->nb );
-#endif
-
     ws_worker *= sizeof(MORSE_Complex64_t);
     ws_host   *= sizeof(MORSE_Complex64_t);
 
@@ -115,9 +98,8 @@ void morse_pzgeqrfhqr( const libhqr_tree_t *qrtree, MORSE_desc_t *A, MORSE_desc_
 #if defined(CHAMELEON_COPY_DIAG)
     {
         /* necessary to avoid dependencies between tasks regarding the diag tile */
-        int nblk = ( A->mt + BS -1 ) / BS;
-        DIAG = (MORSE_desc_t*)malloc(sizeof(MORSE_desc_t));
-        morse_zdesc_alloc_diag(*DIAG, A->mb, A->nb, nblk * A->mb, A->nb, 0, 0, nblk * A->mb, A->nb, A->p, A->q);
+        D = (MORSE_desc_t*)malloc(sizeof(MORSE_desc_t));
+        morse_zdesc_alloc(*D, A->mb, A->nb, A->m, A->n, 0, 0, A->m, A->n, );
     }
 #endif
 
@@ -138,7 +120,7 @@ void morse_pzgeqrfhqr( const libhqr_tree_t *qrtree, MORSE_desc_t *A, MORSE_desc_
             MORSE_TASK_zgeqrt(
                 &options,
                 tempmm, tempkn, ib, TS->nb,
-                A(m, k), ldam,
+                A( m, k), ldam,
                 TS(m, k), TS->mb);
             if ( k < (A->nt-1) ) {
 #if defined(CHAMELEON_COPY_DIAG)
@@ -146,13 +128,13 @@ void morse_pzgeqrfhqr( const libhqr_tree_t *qrtree, MORSE_desc_t *A, MORSE_desc_
                     &options,
                     MorseLower, tempmm, A->nb, A->nb,
                     A(m, k), ldam,
-                    DIAG(m, k), ldam );
+                    D(m, k), ldam );
 #if defined(CHAMELEON_USE_CUDA)
                 MORSE_TASK_zlaset(
                     &options,
                     MorseUpper, tempmm, A->nb,
                     0., 1.,
-                    DIAG(m, k), ldam );
+                    D(m, k), ldam );
 #endif
 #endif
             }
@@ -162,9 +144,9 @@ void morse_pzgeqrfhqr( const libhqr_tree_t *qrtree, MORSE_desc_t *A, MORSE_desc_
                     &options,
                     MorseLeft, MorseConjTrans,
                     tempmm, tempnn, tempkmin, ib, TS->nb,
-                    DIAG(m, k), ldam,
+                    D( m, k), ldam,
                     TS(m, k), TS->mb,
-                    A(m, n), ldam);
+                    A( m, n), ldam);
             }
         }
 
@@ -184,8 +166,8 @@ void morse_pzgeqrfhqr( const libhqr_tree_t *qrtree, MORSE_desc_t *A, MORSE_desc_
                 MORSE_TASK_ztsqrt(
                     &options,
                     tempmm, tempkn, ib, TS->nb,
-                    A(p, k), ldap,
-                    A(m, k), ldam,
+                    A( p, k), ldap,
+                    A( m, k), ldam,
                     TS(m, k), TS->mb);
 
                 for (n = k+1; n < A->nt; n++) {
@@ -194,9 +176,9 @@ void morse_pzgeqrfhqr( const libhqr_tree_t *qrtree, MORSE_desc_t *A, MORSE_desc_
                         &options,
                         MorseLeft, MorseConjTrans,
                         A->nb, tempnn, tempmm, tempnn, A->nb, ib, TS->nb,
-                        A(p, n), ldap,
-                        A(m, n), ldam,
-                        A(m, k), ldam,
+                        A( p, n), ldap,
+                        A( m, n), ldam,
+                        A( m, k), ldam,
                         TS(m, k), TS->mb);
                 }
             }
@@ -206,8 +188,8 @@ void morse_pzgeqrfhqr( const libhqr_tree_t *qrtree, MORSE_desc_t *A, MORSE_desc_
                 MORSE_TASK_zttqrt(
                     &options,
                     tempmm, tempkn, ib, TT->nb,
-                    A(p, k), ldap,
-                    A(m, k), ldam,
+                    A( p, k), ldap,
+                    A( m, k), ldam,
                     TT(m, k), TT->mb);
 
                 for (n = k+1; n < A->nt; n++) {
@@ -216,9 +198,9 @@ void morse_pzgeqrfhqr( const libhqr_tree_t *qrtree, MORSE_desc_t *A, MORSE_desc_
                         &options,
                         MorseLeft, MorseConjTrans,
                         A->mb, tempnn, tempmm, tempnn, A->nb, ib, TT->nb,
-                        A(p, n), ldap,
-                        A(m, n), ldam,
-                        A(m, k), ldam,
+                        A( p, n), ldap,
+                        A( m, n), ldam,
+                        A( m, k), ldam,
                         TT(m, k), TT->mb);
                 }
             }
@@ -233,8 +215,8 @@ void morse_pzgeqrfhqr( const libhqr_tree_t *qrtree, MORSE_desc_t *A, MORSE_desc_
 
 #if defined(CHAMELEON_COPY_DIAG)
     MORSE_Sequence_Wait(sequence);
-    morse_desc_mat_free(DIAG);
-    free(DIAG);
+    morse_desc_mat_free(D);
+    free(D);
 #endif
-    (void)DIAG;
+    (void)D;
 }
diff --git a/compute/zgeqrf.c b/compute/zgeqrf.c
index 51182770c768571843efe8e89e990e2c4e6b2478..f17810f5cd0b0ee6a5abf7dc83c2b5e54f5d2b76 100644
--- a/compute/zgeqrf.c
+++ b/compute/zgeqrf.c
@@ -205,7 +205,8 @@ int MORSE_zgeqrf_Tile(MORSE_desc_t *A, MORSE_desc_t *T)
     return status;
 }
 
-/***************************************************************************//**
+/**
+ *****************************************************************************
  *
  * @ingroup MORSE_Complex64_t_Tile_Async
  *
diff --git a/compute/zgeqrf_param.c b/compute/zgeqrf_param.c
new file mode 100644
index 0000000000000000000000000000000000000000..b2dd152d297e767ce0317845a8639e2ac8286c4a
--- /dev/null
+++ b/compute/zgeqrf_param.c
@@ -0,0 +1,290 @@
+/**
+ *
+ * @copyright (c) 2009-2014 The University of Tennessee and The University
+ *                          of Tennessee Research Foundation.
+ *                          All rights reserved.
+ * @copyright (c) 2012-2014 Inria. All rights reserved.
+ * @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved.
+ *
+ **/
+
+/**
+ *
+ * @file zgeqrf_param.c
+ *
+ *  MORSE computational routines
+ *  MORSE is a software package provided by Univ. of Tennessee,
+ *  Univ. of California Berkeley and Univ. of Colorado Denver
+ *
+ * @version 2.5.0
+ * @comment This file has been automatically generated
+ *          from Plasma 2.5.0 for MORSE 1.0.0
+ * @author Jakub Kurzak
+ * @author Mathieu Faverge
+ * @author Emmanuel Agullo
+ * @author Cedric Castagnede
+ * @date 2010-11-15
+ * @precisions normal z -> s d c
+ *
+ **/
+#include "control/common.h"
+
+/**
+ *******************************************************************************
+ *
+ * @ingroup MORSE_Complex64_t
+ *
+ * MORSE_zgeqrf_param - Computes the tile QR factorization of a complex M-by-N
+ * matrix A: A = Q * R.
+ *
+ *******************************************************************************
+ *
+ * @param[in] M
+ *          The number of rows of the matrix A. M >= 0.
+ *
+ * @param[in] N
+ *          The number of columns of the matrix A.  N >= 0.
+ *
+ * @param[in] A
+ *          On entry, the M-by-N matrix A.
+ *          On exit, the elements on and above the diagonal of the array contain the min(M,N)-by-N
+ *          upper trapezoidal matrix R (R is upper triangular if M >= N); the elements below the
+ *          diagonal represent the unitary matrix Q as a product of elementary reflectors stored
+ *          by tiles.
+ *
+ * @param[in] LDA
+ *          The leading dimension of the array A. LDA >= max(1,M).
+ *
+ * @param[in] descTS
+ *          On exit, auxiliary factorization data, required by MORSE_zgeqrs to solve the system
+ *          of equations.
+ *
+ *******************************************************************************
+ *
+ * @return
+ *          \retval MORSE_SUCCESS successful exit
+ *          \retval <0 if -i, the i-th argument had an illegal value
+ *
+ *******************************************************************************
+ *
+ * @sa MORSE_zgeqrf_param_Tile
+ * @sa MORSE_zgeqrf_param_Tile_Async
+ * @sa MORSE_cgeqrf
+ * @sa MORSE_dgeqrf
+ * @sa MORSE_sgeqrf
+ * @sa MORSE_zgeqrs
+ *
+ ******************************************************************************/
+int MORSE_zgeqrf_param(const libhqr_tree_t *qrtree, int M, int N,
+                       MORSE_Complex64_t *A, int LDA,
+                       MORSE_desc_t *descTS, MORSE_desc_t *descTT)
+{
+    int NB;
+    int status;
+    MORSE_context_t *morse;
+    MORSE_sequence_t *sequence = NULL;
+    MORSE_request_t request = MORSE_REQUEST_INITIALIZER;
+    MORSE_desc_t descA;
+
+    morse = morse_context_self();
+    if (morse == NULL) {
+        morse_fatal_error("MORSE_zgeqrf_param", "MORSE not initialized");
+        return MORSE_ERR_NOT_INITIALIZED;
+    }
+
+    /* Check input arguments */
+    if (M < 0) {
+        morse_error("MORSE_zgeqrf_param", "illegal value of M");
+        return -1;
+    }
+    if (N < 0) {
+        morse_error("MORSE_zgeqrf_param", "illegal value of N");
+        return -2;
+    }
+    if (LDA < chameleon_max(1, M)) {
+        morse_error("MORSE_zgeqrf_param", "illegal value of LDA");
+        return -4;
+    }
+
+    /* Quick return */
+    if (chameleon_min(M, N) == 0)
+        return MORSE_SUCCESS;
+
+    /* Tune NB & IB depending on M, N & NRHS; Set NBNBSIZE */
+    status = morse_tune(MORSE_FUNC_ZGELS, M, N, 0);
+    if (status != MORSE_SUCCESS) {
+        morse_error("MORSE_zgeqrf_param", "morse_tune() failed");
+        return status;
+    }
+
+    /* Set NT */
+    NB = MORSE_NB;
+
+    morse_sequence_create(morse, &sequence);
+
+/*    if ( MORSE_TRANSLATION == MORSE_OUTOFPLACE ) {*/
+        morse_zooplap2tile( descA, A, NB, NB, LDA, N, 0, 0, M, N, sequence, &request,
+                             morse_desc_mat_free(&(descA)) );
+/*    } else {*/
+/*        morse_ziplap2tile( descA, A, NB, NB, LDA, N, 0, 0, M, N,*/
+/*                            sequence, &request);*/
+/*    }*/
+
+    /* Call the tile interface */
+        MORSE_zgeqrf_param_Tile_Async(qrtree, &descA, descTS, descTT, sequence, &request);
+
+/*    if ( MORSE_TRANSLATION == MORSE_OUTOFPLACE ) {*/
+        morse_zooptile2lap(descA, A, NB, NB, LDA, N,  sequence, &request);
+        morse_sequence_wait(morse, sequence);
+        morse_desc_mat_free(&descA);
+/*    } else {*/
+/*        morse_ziptile2lap( descA, A, NB, NB, LDA, N,  sequence, &request);*/
+/*        morse_sequence_wait(morse, sequence);*/
+/*    }*/
+
+    status = sequence->status;
+    morse_sequence_destroy(morse, sequence);
+    return status;
+}
+
+/**
+ *******************************************************************************
+ *
+ * @ingroup MORSE_Complex64_t_Tile
+ *
+ *  MORSE_zgeqrf_param_Tile - Computes the tile QR factorization of a matrix.
+ *  Tile equivalent of MORSE_zgeqrf_param().
+ *  Operates on matrices stored by tiles.
+ *  All matrices are passed through descriptors.
+ *  All dimensions are taken from the descriptors.
+ *
+ *******************************************************************************
+ *
+ * @param[in,out] A
+ *          On entry, the M-by-N matrix A.
+ *          On exit, the elements on and above the diagonal of the array contain the min(M,N)-by-N
+ *          upper trapezoidal matrix R (R is upper triangular if M >= N); the elements below the
+ *          diagonal represent the unitary matrix Q as a product of elementary reflectors stored
+ *          by tiles.
+ *
+ * @param[out] T
+ *          On exit, auxiliary factorization data, required by MORSE_zgeqrs to solve the system
+ *          of equations.
+ *
+ *******************************************************************************
+ *
+ * @return
+ *          \retval MORSE_SUCCESS successful exit
+ *
+ *******************************************************************************
+ *
+ * @sa MORSE_zgeqrf_param
+ * @sa MORSE_zgeqrf_param_Tile_Async
+ * @sa MORSE_cgeqrf_param_Tile
+ * @sa MORSE_dgeqrf_param_Tile
+ * @sa MORSE_sgeqrf_param_Tile
+ * @sa MORSE_zgeqrs_param_Tile
+ *
+ ******************************************************************************/
+int MORSE_zgeqrf_param_Tile(const libhqr_tree_t *qrtree, MORSE_desc_t *A, MORSE_desc_t *TS, MORSE_desc_t *TT)
+{
+    MORSE_context_t *morse;
+    MORSE_sequence_t *sequence = NULL;
+    MORSE_request_t request = MORSE_REQUEST_INITIALIZER;
+    int status;
+
+    morse = morse_context_self();
+    if (morse == NULL) {
+        morse_fatal_error("MORSE_zgeqrf_param_Tile", "MORSE not initialized");
+        return MORSE_ERR_NOT_INITIALIZED;
+    }
+    morse_sequence_create(morse, &sequence);
+    MORSE_zgeqrf_param_Tile_Async(qrtree, A, TS, TT, sequence, &request);
+    morse_sequence_wait(morse, sequence);
+    RUNTIME_desc_getoncpu(A);
+
+    status = sequence->status;
+    morse_sequence_destroy(morse, sequence);
+    return status;
+}
+
+/**
+ *****************************************************************************
+ *
+ * @ingroup MORSE_Complex64_t_Tile_Async
+ *
+ *  MORSE_zgeqrf_param_Tile_Async - Computes the tile QR factorization of a matrix.
+ *  Non-blocking equivalent of MORSE_zgeqrf_param_Tile().
+ *  May return before the computation is finished.
+ *  Allows for pipelining of operations at runtime.
+ *
+ *******************************************************************************
+ *
+ * @param[in] sequence
+ *          Identifies the sequence of function calls that this call belongs to
+ *          (for completion checks and exception handling purposes).
+ *
+ * @param[out] request
+ *          Identifies this function call (for exception handling purposes).
+ *
+ *******************************************************************************
+ *
+ * @sa MORSE_zgeqrf_param
+ * @sa MORSE_zgeqrf_param_Tile
+ * @sa MORSE_cgeqrf_param_Tile_Async
+ * @sa MORSE_dgeqrf_param_Tile_Async
+ * @sa MORSE_sgeqrf_param_Tile_Async
+ * @sa MORSE_zgeqrs_param_Tile_Async
+ *
+ ******************************************************************************/
+int MORSE_zgeqrf_param_Tile_Async(const libhqr_tree_t *qrtree, MORSE_desc_t *A, MORSE_desc_t *TS, MORSE_desc_t *TT,
+                             MORSE_sequence_t *sequence, MORSE_request_t *request)
+{
+    MORSE_context_t *morse;
+
+    morse = morse_context_self();
+    if (morse == NULL) {
+        morse_error("MORSE_zgeqrf_param_Tile", "MORSE not initialized");
+        return MORSE_ERR_NOT_INITIALIZED;
+    }
+    if (sequence == NULL) {
+        morse_fatal_error("MORSE_zgeqrf_param_Tile", "NULL sequence");
+        return MORSE_ERR_UNALLOCATED;
+    }
+    if (request == NULL) {
+        morse_fatal_error("MORSE_zgeqrf_param_Tile", "NULL request");
+        return MORSE_ERR_UNALLOCATED;
+    }
+    /* Check sequence status */
+    if (sequence->status == MORSE_SUCCESS)
+        request->status = MORSE_SUCCESS;
+    else
+        return morse_request_fail(sequence, request, MORSE_ERR_SEQUENCE_FLUSHED);
+
+    /* Check descriptors for correctness */
+    if (morse_desc_check(A) != MORSE_SUCCESS) {
+        morse_error("MORSE_zgeqrf_param_Tile", "invalid first descriptor");
+        return morse_request_fail(sequence, request, MORSE_ERR_ILLEGAL_VALUE);
+    }
+    if (morse_desc_check(TS) != MORSE_SUCCESS) {
+        morse_error("MORSE_zgeqrf_param_Tile", "invalid second descriptor");
+        return morse_request_fail(sequence, request, MORSE_ERR_ILLEGAL_VALUE);
+    }
+    if (morse_desc_check(TT) != MORSE_SUCCESS) {
+        morse_error("MORSE_zgeqrf_param_Tile", "invalid second descriptor");
+        return morse_request_fail(sequence, request, MORSE_ERR_ILLEGAL_VALUE);
+    }
+    /* Check input arguments */
+    if (A->nb != A->mb) {
+        morse_error("MORSE_zgeqrf_param_Tile", "only square tiles supported");
+        return morse_request_fail(sequence, request, MORSE_ERR_ILLEGAL_VALUE);
+    }
+    /* Quick return */
+/*
+    if (chameleon_min(M, N) == 0)
+        return MORSE_SUCCESS;
+*/
+    morse_pzgeqrf_param(qrtree, A, TS, TT, sequence, request);
+
+    return MORSE_SUCCESS;
+}
diff --git a/control/compute_z.h b/control/compute_z.h
index bb930ba0ff84322f11b7c5969ea268ae7a91b831..6ff705255f00caa570aecfa0225813b25817c40c 100644
--- a/control/compute_z.h
+++ b/control/compute_z.h
@@ -154,3 +154,8 @@ void morse_pzunmqrrh(MORSE_enum side, MORSE_enum trans, MORSE_desc_t *A, MORSE_d
 void morse_pzunmlq(MORSE_enum side, MORSE_enum trans, MORSE_desc_t *A, MORSE_desc_t *B, MORSE_desc_t *T, MORSE_sequence_t *sequence, MORSE_request_t *request);
 void morse_pzunmlqrh(MORSE_enum side, MORSE_enum trans, MORSE_desc_t *A, MORSE_desc_t *B, MORSE_desc_t *T, int BS, MORSE_sequence_t *sequence, MORSE_request_t *request);
 void morse_pzbuild( MORSE_enum uplo, MORSE_desc_t *A, void *user_data, void* user_build_callback, MORSE_sequence_t *sequence, MORSE_request_t *request );
+
+#if defined(CHAMELEON_USE_LIBHQR)
+void morse_pzgeqrf_param( const libhqr_tree_t *qrtree, MORSE_desc_t *A, MORSE_desc_t *TS, MORSE_desc_t *TT,
+                          MORSE_sequence_t *sequence, MORSE_request_t *request);
+#endif /* defined(CHAMELEON_USE_LIBHQR) */
diff --git a/include/chameleon_config.h.in b/include/chameleon_config.h.in
index 83350ba3a9532ab721de01357d3bddb647e13abc..5da2e208ddbe8fef68080361b82289de6025e0da 100644
--- a/include/chameleon_config.h.in
+++ b/include/chameleon_config.h.in
@@ -37,6 +37,9 @@
 /* Communication engine */
 #cmakedefine CHAMELEON_USE_MPI
 
+/* Householder reduction trees for QR like operations */
+#cmakedefine CHAMELEON_USE_LIBHQR
+
 /* GPU Support */
 #cmakedefine CHAMELEON_USE_CUDA
 #cmakedefine CHAMELEON_USE_CUBLAS
@@ -45,5 +48,4 @@
 /* Simulating */
 #cmakedefine CHAMELEON_SIMULATION
 
-
 #endif  /* CHAMELEON_CONFIG_H_HAS_BEEN_INCLUDED */
diff --git a/include/morse.h.in b/include/morse.h.in
index b0460b6950bfbf8c3f5967742c730421143cec7b..c972d81a6c7223b03d6432d1660c2a7cf9a142a7 100644
--- a/include/morse.h.in
+++ b/include/morse.h.in
@@ -32,7 +32,6 @@
 #define MORSE_VERSION_MINOR @MORSE_VERSION_MINOR@
 #define MORSE_VERSION_MICRO @MORSE_VERSION_MICRO@
 
-
 /* ****************************************************************************
  * MORSE types and constants
  */
@@ -122,6 +121,10 @@ int MORSE_Sequence_Wait    (MORSE_sequence_t *sequence);
 }
 #endif
 
+#if defined(CHAMELEON_USE_LIBHQR)
+#include "libhqr.h"
+#endif /* defined(CHAMELEON_USE_LIBHQR) */
+
 #include "morse_z.h"
 #include "morse_c.h"
 #include "morse_d.h"
diff --git a/include/morse_z.h b/include/morse_z.h
index 65f911f00a7f257fea0d897da102c1c8294ef9fa..47e0b4c60757919bb0aeae3ddc11fc762b6d6bf6 100644
--- a/include/morse_z.h
+++ b/include/morse_z.h
@@ -273,9 +273,17 @@ int MORSE_zunmqr_Tile_Async(MORSE_enum side, MORSE_enum trans, MORSE_desc_t *A,
 //int MORSE_zgecfi_Async(int m, int n, MORSE_Complex64_t *A, MORSE_enum f_in, int imb, int inb, MORSE_enum f_out, int omb, int onb, MORSE_sequence_t *sequence, MORSE_request_t *request);
 //int MORSE_zgetmi_Async(int m, int n, MORSE_Complex64_t *A, MORSE_enum f_in, int mb,  int inb, MORSE_sequence_t *sequence, MORSE_request_t *request);
 
-/** ****************************************************************************
+/**
+ *  Declarations of libhqr dependent functions.
+ */
+#if defined(CHAMELEON_USE_LIBHQR)
+int MORSE_zgeqrf_param(const libhqr_tree_t *qrtree, int M, int N, MORSE_Complex64_t *A, int LDA, MORSE_desc_t *descTS, MORSE_desc_t *descTT);
+int MORSE_zgeqrf_param_Tile(const libhqr_tree_t *qrtree, MORSE_desc_t *A, MORSE_desc_t *TS, MORSE_desc_t *TT);
+int MORSE_zgeqrf_param_Tile_Async(const libhqr_tree_t *qrtree, MORSE_desc_t *A, MORSE_desc_t *TS, MORSE_desc_t *TT, MORSE_sequence_t *sequence, MORSE_request_t *request);
+#endif /* defined(CHAMELEON_USE_LIBHQR) */
+/**
  *  Declarations of workspace allocation functions (tile layout) - alphabetical order
- **/
+ */
 int MORSE_Alloc_Workspace_zgesv_incpiv(        int N, MORSE_desc_t **descL, int **IPIV, int p, int q);
 int MORSE_Alloc_Workspace_zgetrf_incpiv(int M, int N, MORSE_desc_t **descL, int **IPIV, int p, int q);