diff --git a/CMakeLists.txt b/CMakeLists.txt
index b5ea70886363d9129ec67bc51367e725ce85ac57..38788dd4c961cfe912da784aeb2351fd8f325391 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -706,6 +706,11 @@ if( CHAMELEON_SCHED_STARPU )
             set(HAVE_STARPU_IDLE_PREFETCH 1)
             message("-- ${Blue}Add definition HAVE_STARPU_IDLE_PREFETCH${ColourReset}")
         endif()
+        check_function_exists(starpu_set_iteration STARPU_SET_ITERATION_FOUND)
+        if ( STARPU_SET_ITERATION_FOUND )
+            set(HAVE_STARPU_SET_ITERATION 1)
+            message("-- ${Blue}Add definition HAVE_STARPU_SET_ITERATION${ColourReset}")
+        endif()
         check_function_exists(starpu_data_wont_use STARPU_DATA_WONT_USE_FOUND)
         if ( STARPU_DATA_WONT_USE_FOUND )
             set(HAVE_STARPU_DATA_WONT_USE 1)
diff --git a/compute/pzgelqf.c b/compute/pzgelqf.c
index 416f043e8b2a169138a5d801823e5bae4620b40f..0608f6d36f40064fceb066d601204a8cfdd783b0 100644
--- a/compute/pzgelqf.c
+++ b/compute/pzgelqf.c
@@ -115,6 +115,8 @@ void morse_pzgelqf(MORSE_desc_t *A, MORSE_desc_t *T,
 #endif
 
     for (k = 0; k < minMNT; k++) {
+        RUNTIME_set_iteration(k);
+
         tempkm = k == A->mt-1 ? A->m-k*A->mb : A->mb;
         tempkn = k == A->nt-1 ? A->n-k*A->nb : A->nb;
         ldak = BLKLDD(A, k);
diff --git a/compute/pzgelqfrh.c b/compute/pzgelqfrh.c
index caefaf5c82e53145047e6c07c57dfedb7622c6db..9295ac65748e99bb5ecadecbe3f15a7dc32643ff 100644
--- a/compute/pzgelqfrh.c
+++ b/compute/pzgelqfrh.c
@@ -119,6 +119,8 @@ void morse_pzgelqfrh(MORSE_desc_t *A, MORSE_desc_t *T, int BS,
 #endif
 
     for (k = 0; k < chameleon_min(A->mt, A->nt); k++) {
+        RUNTIME_set_iteration(k);
+
         tempkm = k == A->mt-1 ? A->m-k*A->mb : A->mb;
         ldak = BLKLDD(A, k);
         for (N = k; N < A->nt; N += BS) {
diff --git a/compute/pzgeqrf.c b/compute/pzgeqrf.c
index ca0dfb2e9e3573b4e52cb573eff41710b1cdf7db..c3d6fa742f8be5b16b73e760687da8e7914b967a 100644
--- a/compute/pzgeqrf.c
+++ b/compute/pzgeqrf.c
@@ -110,6 +110,8 @@ void morse_pzgeqrf(MORSE_desc_t *A, MORSE_desc_t *T,
 #endif
 
     for (k = 0; k < minMNT; k++) {
+        RUNTIME_set_iteration(k);
+
         tempkm = k == A->mt-1 ? A->m-k*A->mb : A->mb;
         tempkn = k == A->nt-1 ? A->n-k*A->nb : A->nb;
         ldak = BLKLDD(A, k);
diff --git a/compute/pzgeqrfrh.c b/compute/pzgeqrfrh.c
index fd002fc64cfba3750172019861fa05477e2c4bc1..b96eddc07f1b82228a5869a1c8c5e671b5e43e20 100644
--- a/compute/pzgeqrfrh.c
+++ b/compute/pzgeqrfrh.c
@@ -118,6 +118,8 @@ void morse_pzgeqrfrh(MORSE_desc_t *A, MORSE_desc_t *T, int BS,
 
     K = chameleon_min(A->mt, A->nt);
     for (k = 0; k < K; k++) {
+        RUNTIME_set_iteration(k);
+
         tempkn = k == A->nt-1 ? A->n-k*A->nb : A->nb;
         for (M = k; M < A->mt; M += BS) {
             tempMm = M == A->mt-1 ? A->m-M*A->mb : A->mb;
diff --git a/compute/pzgetrf_incpiv.c b/compute/pzgetrf_incpiv.c
index 43bd1628703ee9a3681057838036cf44f4558452..c280a693c4d59d286e3d7ab95e7f42c7a43b4364 100644
--- a/compute/pzgetrf_incpiv.c
+++ b/compute/pzgetrf_incpiv.c
@@ -78,6 +78,8 @@ void morse_pzgetrf_incpiv(MORSE_desc_t *A, MORSE_desc_t *L, int *IPIV,
     morse_zdesc_alloc_diag(*DIAG, A->mb, A->nb, chameleon_min(A->m, A->n), A->nb, 0, 0, chameleon_min(A->m, A->n), A->nb, A->p, A->q);
 
     for (k = 0; k < minMNT; k++) {
+        RUNTIME_set_iteration(k);
+
         tempkm = k == A->mt-1 ? A->m-k*A->mb : A->mb;
         tempkn = k == A->nt-1 ? A->n-k*A->nb : A->nb;
         ldak = BLKLDD(A, k);
diff --git a/compute/pzgetrf_nopiv.c b/compute/pzgetrf_nopiv.c
index 5eea46d894f76cac504ee4232fd2168f2872ada4..75a980138dd2248c904c8bd77736847bb03f5af6 100644
--- a/compute/pzgetrf_nopiv.c
+++ b/compute/pzgetrf_nopiv.c
@@ -54,6 +54,8 @@ void morse_pzgetrf_nopiv(MORSE_desc_t *A,
     ib = MORSE_IB;
 
     for (k = 0; k < chameleon_min(A->mt, A->nt); k++) {
+        RUNTIME_set_iteration(k);
+
         tempkm = k == A->mt-1 ? A->m-k*A->mb : A->mb;
         tempkn = k == A->nt-1 ? A->n-k*A->nb : A->nb;
         ldak = BLKLDD(A, k);
diff --git a/compute/pzhetrd_he2hb.c b/compute/pzhetrd_he2hb.c
index e1bf3dc84c3f53915aba49308378181d9056ef3f..0fed5cc88b63f29c6d82d27a537f7f5cc25eea75 100644
--- a/compute/pzhetrd_he2hb.c
+++ b/compute/pzhetrd_he2hb.c
@@ -137,6 +137,8 @@ void morse_pzhetrd_he2hb(MORSE_enum uplo,
 
     if (uplo == MorseLower) {
        for (k = 0; k < A->nt-1; k++){
+           RUNTIME_set_iteration(k);
+
            tempkm = k+1 == A->mt-1 ? A->m-(k+1)*A->mb : A->mb;
            tempkn = k   == A->nt-1 ? A->n- k   *A->nb : A->nb;
            ldak1 = BLKLDD(A, k+1);
@@ -290,6 +292,8 @@ void morse_pzhetrd_he2hb(MORSE_enum uplo,
     }
     else {
        for (k = 0; k < A->nt-1; k++){
+           RUNTIME_set_iteration(k);
+
            tempkn = k+1 == A->nt-1 ? A->n-(k+1)*A->nb : A->nb;
            tempkm = k   == A->mt-1 ? A->m- k   *A->mb : A->mb;
            ldak  = BLKLDD(A, k);
diff --git a/compute/pzpotrf.c b/compute/pzpotrf.c
index 711bc236e4e890991ce0b6e1784ffc4f31a658df..fe8143714ce19bf072b23ce90afcbe5d1907edca 100644
--- a/compute/pzpotrf.c
+++ b/compute/pzpotrf.c
@@ -71,6 +71,8 @@ void morse_pzpotrf(MORSE_enum uplo, MORSE_desc_t *A,
      */
     if (uplo == MorseLower) {
         for (k = 0; k < A->mt; k++) {
+            RUNTIME_set_iteration(k);
+
             tempkm = k == A->mt-1 ? A->m-k*A->mb : A->mb;
             ldak = BLKLDD(A, k);
 
@@ -128,6 +130,8 @@ void morse_pzpotrf(MORSE_enum uplo, MORSE_desc_t *A,
      */
     else {
         for (k = 0; k < A->nt; k++) {
+            RUNTIME_set_iteration(k);
+
             tempkm = k == A->nt-1 ? A->n-k*A->nb : A->nb;
             ldak = BLKLDD(A, k);
 
diff --git a/compute/pzpotrimm.c b/compute/pzpotrimm.c
index d388cb3de6cc4d4ef4218818d4d6947b63143b1f..8f5f83f7ed0ed7c3ab41f5686f1f6430fefdb80a 100644
--- a/compute/pzpotrimm.c
+++ b/compute/pzpotrimm.c
@@ -76,6 +76,8 @@ void morse_pzpotrimm(MORSE_enum uplo, MORSE_desc_t *A, MORSE_desc_t *B, MORSE_de
          *  ZPOTRF
          */
         for (k = 0; k < A->mt; k++) {
+            RUNTIME_set_iteration(k);
+
             tempkm = k == A->mt-1 ? A->m-k*A->mb : A->mb;
             ldak = BLKLDD(A, k);
 
@@ -124,6 +126,8 @@ void morse_pzpotrimm(MORSE_enum uplo, MORSE_desc_t *A, MORSE_desc_t *B, MORSE_de
          *  ZTRTRI
          */
         for (k = 0; k < A->nt; k++) {
+            RUNTIME_set_iteration(A->nt + k);
+
             tempkn = k == A->nt-1 ? A->n-k*A->nb : A->nb;
             ldak = BLKLDD(A, k);
             for (m = k+1; m < A->mt; m++) {
@@ -170,6 +174,8 @@ void morse_pzpotrimm(MORSE_enum uplo, MORSE_desc_t *A, MORSE_desc_t *B, MORSE_de
          *  ZLAUUM
          */
         for (k = 0; k < A->mt; k++) {
+            RUNTIME_set_iteration(2*A->nt + k);
+
             tempkm = k == A->mt-1 ? A->m-k*A->mb : A->mb;
             ldak = BLKLDD(A, k);
             for(n = 0; n < k; n++) {
@@ -211,6 +217,8 @@ void morse_pzpotrimm(MORSE_enum uplo, MORSE_desc_t *A, MORSE_desc_t *B, MORSE_de
          *  ZSYMM Right / Lower
          */
         for (k = 0; k < C->nt; k++) {
+            RUNTIME_set_iteration(3*A->nt + k);
+
             tempkn = k == C->nt-1 ? C->n-k*C->nb : C->nb;
             ldak = BLKLDD(A, k);
             zbeta = k == 0 ? beta : zone;
@@ -269,6 +277,8 @@ void morse_pzpotrimm(MORSE_enum uplo, MORSE_desc_t *A, MORSE_desc_t *B, MORSE_de
          *  ZPOTRF
          */
         for (k = 0; k < A->nt; k++) {
+            RUNTIME_set_iteration(k);
+
             tempkm = k == A->nt-1 ? A->n-k*A->nb : A->nb;
             ldak = BLKLDD(A, k);
             MORSE_TASK_zpotrf(
@@ -317,6 +327,8 @@ void morse_pzpotrimm(MORSE_enum uplo, MORSE_desc_t *A, MORSE_desc_t *B, MORSE_de
          *  ZTRTRI
          */
         for (k = 0; k < A->mt; k++) {
+            RUNTIME_set_iteration(A->nt + k);
+
             tempkm = k == A->mt-1 ? A->m-k*A->mb : A->mb;
             ldak = BLKLDD(A, k);
             for (n = k+1; n < A->nt; n++) {
@@ -363,6 +375,8 @@ void morse_pzpotrimm(MORSE_enum uplo, MORSE_desc_t *A, MORSE_desc_t *B, MORSE_de
          *  ZLAUUM
          */
         for (k = 0; k < A->mt; k++) {
+            RUNTIME_set_iteration(2*A->nt + k);
+
             tempkn = k == A->nt-1 ? A->n-k*A->nb : A->nb;
             ldak = BLKLDD(A, k);
 
@@ -406,6 +420,8 @@ void morse_pzpotrimm(MORSE_enum uplo, MORSE_desc_t *A, MORSE_desc_t *B, MORSE_de
          *  ZSYMM Right / Upper
          */
         for (k = 0; k < C->nt; k++) {
+            RUNTIME_set_iteration(3*A->nt + k);
+
             tempkn = k == C->nt-1 ? C->n-k*C->nb : C->nb;
             ldak = BLKLDD(A, k);
             zbeta = k == 0 ? beta : zone;
diff --git a/compute/pzsytrf.c b/compute/pzsytrf.c
index de662bee8f4c0d351ba1e735ec5077c4b4f37b1a..622a4d0b2a8d302e475cc18afad67da720da2d34 100644
--- a/compute/pzsytrf.c
+++ b/compute/pzsytrf.c
@@ -60,6 +60,8 @@ void morse_pzsytrf(MORSE_enum uplo, MORSE_desc_t *A,
      */
     if (uplo == MorseLower) {
         for (k = 0; k < A->mt; k++) {
+            RUNTIME_set_iteration(k);
+
             tempkm = k == A->mt-1 ? A->m-k*A->mb : A->mb;
             ldak = BLKLDD(A, k);
 
@@ -110,6 +112,8 @@ void morse_pzsytrf(MORSE_enum uplo, MORSE_desc_t *A,
      */
     else {
         for (k = 0; k < A->nt; k++) {
+            RUNTIME_set_iteration(k);
+
             tempkm = k == A->nt-1 ? A->n-k*A->nb : A->nb;
             ldak = BLKLDD(A, k);
             MORSE_TASK_zsytrf_nopiv(
diff --git a/compute/pztpgqrt.c b/compute/pztpgqrt.c
index 5b0672d031d537dcfaf402f655720a86e0a194e4..7b31f39c2889abb369295c0de78bbded528835d0 100644
--- a/compute/pztpgqrt.c
+++ b/compute/pztpgqrt.c
@@ -101,6 +101,8 @@ void morse_pztpgqrt( int L,
 #endif
 
     for (k = V1->nt-1; k >= 0; k--) {
+        RUNTIME_set_iteration(k);
+
         tempkm = k == V1->mt-1 ? V1->m-k*V1->mb : V1->mb;
         tempkk = k == V1->nt-1 ? V1->n-k*V1->nb : V1->nb;
         tempkn = k == Q1->nt-1 ? Q1->n-k*Q1->nb : Q1->nb;
diff --git a/compute/pztpqrt.c b/compute/pztpqrt.c
index 9b60ef164a62cb22288894358fa050262d05c06f..a1c6c9149ee11469ba8dee209e6caa7815e55d64 100644
--- a/compute/pztpqrt.c
+++ b/compute/pztpqrt.c
@@ -91,6 +91,8 @@ void morse_pztpqrt( int L, MORSE_desc_t *A, MORSE_desc_t *B, MORSE_desc_t *T,
     RUNTIME_options_ws_alloc( &options, ws_worker, ws_host );
 
     for (k = 0; k < A->nt; k++) {
+        RUNTIME_set_iteration(k);
+
         tempkm = k == A->mt-1 ? A->m-k*A->mb : A->mb;
         tempkn = k == A->nt-1 ? A->n-k*A->nb : A->nb;
         ldak = BLKLDD(A, k);
diff --git a/compute/pztrtri.c b/compute/pztrtri.c
index ba77c7a90cc82b37e2ffd5f9f73b9fddc0de4f95..b6777d212818feb4a07d3161f5acce157178dbee 100644
--- a/compute/pztrtri.c
+++ b/compute/pztrtri.c
@@ -56,6 +56,8 @@ void morse_pztrtri(MORSE_enum uplo, MORSE_enum diag, MORSE_desc_t *A,
      */
     if (uplo == MorseLower) {
         for (k = 0; k < A->nt; k++) {
+            RUNTIME_set_iteration(k);
+
             tempkn = k == A->nt-1 ? A->n-k*A->nb : A->nb;
             ldak = BLKLDD(A, k);
             for (m = k+1; m < A->mt; m++) {
@@ -104,6 +106,8 @@ void morse_pztrtri(MORSE_enum uplo, MORSE_enum diag, MORSE_desc_t *A,
      */
     else {
         for (k = 0; k < A->mt; k++) {
+            RUNTIME_set_iteration(k);
+
             tempkm = k == A->mt-1 ? A->m-k*A->mb : A->mb;
             ldak = BLKLDD(A, k);
             for (n = k+1; n < A->nt; n++) {
diff --git a/compute/pzunglq.c b/compute/pzunglq.c
index 37ecea8efb8b0d2d37aad2672123b1df868a0d2a..56d43c833babb5bf5428cd4f8a6e2e555a92d7df 100644
--- a/compute/pzunglq.c
+++ b/compute/pzunglq.c
@@ -98,6 +98,8 @@ void morse_pzunglq(MORSE_desc_t *A, MORSE_desc_t *Q, MORSE_desc_t *T,
 #endif
 
     for (k = minMT-1; k >= 0; k--) {
+        RUNTIME_set_iteration(k);
+
         tempAkm  = k == A->mt-1 ? A->m-k*A->mb : A->mb;
         tempAkn  = k == A->nt-1 ? A->n-k*A->nb : A->nb;
         tempkmin = chameleon_min( tempAkn, tempAkm );
diff --git a/compute/pzunglqrh.c b/compute/pzunglqrh.c
index 59717f431e43a9c333f899e85cf28be8f3de8b1d..09b67e012599eb9b1fdc8597c6cf8a07b9f5a1e2 100644
--- a/compute/pzunglqrh.c
+++ b/compute/pzunglqrh.c
@@ -99,6 +99,8 @@ void morse_pzunglqrh(MORSE_desc_t *A, MORSE_desc_t *Q,
 
     K = chameleon_min(A->mt, A->nt);
     for (k = K-1; k >= 0; k--) {
+        RUNTIME_set_iteration(k);
+
         tempkm = k == A->mt-1 ? A->m-k*A->mb : A->mb;
         ldak = BLKLDD(A, k);
         lastRD = 0;
diff --git a/compute/pzungqr.c b/compute/pzungqr.c
index 23f33b7e816e74b5b727655441ab839bec18cf03..a93983d1e7b7be3f5f7e03c2405b79f3738ab4a5 100644
--- a/compute/pzungqr.c
+++ b/compute/pzungqr.c
@@ -98,6 +98,8 @@ void morse_pzungqr(MORSE_desc_t *A, MORSE_desc_t *Q, MORSE_desc_t *T,
 #endif
 
     for (k = minMT-1; k >= 0; k--) {
+        RUNTIME_set_iteration(k);
+
         tempAkm  = k == A->mt-1 ? A->m-k*A->mb : A->mb;
         tempAkn  = k == A->nt-1 ? A->n-k*A->nb : A->nb;
         tempkmin = chameleon_min( tempAkn, tempAkm );
diff --git a/compute/pzungqrrh.c b/compute/pzungqrrh.c
index 1a2470eceb767f9c7d40f269c222d84b9b17cbdc..dcacc344f37446a192f43102daee1f6a328dd366 100644
--- a/compute/pzungqrrh.c
+++ b/compute/pzungqrrh.c
@@ -101,6 +101,8 @@ void morse_pzungqrrh(MORSE_desc_t *A, MORSE_desc_t *Q,
 
     K = chameleon_min(A->mt, A->nt);
     for (k = K-1; k >= 0; k--) {
+        RUNTIME_set_iteration(k);
+
         tempkn = k == A->nt-1 ? A->n-k*A->nb : A->nb;
         lastRD = 0;
         for (RD = BS; RD < A->mt-k; RD *= 2)
diff --git a/compute/pzunmlq.c b/compute/pzunmlq.c
index 3cb7d8591eeed71062aaa4456372918dd7b1f962..448eff9efe98dcf9780d52af9f818d8792da9c4a 100644
--- a/compute/pzunmlq.c
+++ b/compute/pzunmlq.c
@@ -105,6 +105,8 @@ void morse_pzunmlq(MORSE_enum side, MORSE_enum trans,
              *  MorseLeft / MorseNoTrans
              */
             for (k = 0; k < minMT; k++) {
+                RUNTIME_set_iteration(k);
+
                 tempkm   = k == B->mt-1 ? B->m-k*B->mb : B->mb;
                 tempkmin = k == minMT-1 ? minM-k*A->nb : A->nb;
                 ldak = BLKLDD(A, k);
@@ -155,6 +157,8 @@ void morse_pzunmlq(MORSE_enum side, MORSE_enum trans,
              *  MorseLeft / MorseConjTrans
              */
             for (k = minMT-1; k >= 0; k--) {
+                RUNTIME_set_iteration(k);
+
                 tempkm   = k == B->mt-1 ? B->m-k*B->mb : B->mb;
                 tempkmin = k == minMT-1 ? minM-k*A->nb : A->nb;
                 ldak = BLKLDD(A, k);
@@ -207,6 +211,8 @@ void morse_pzunmlq(MORSE_enum side, MORSE_enum trans,
              *  MorseRight / MorseNoTrans
              */
             for (k = minMT-1; k >= 0; k--) {
+                RUNTIME_set_iteration(k);
+
                 tempkn   = k == B->nt -1 ? B->n -k*B->nb : B->nb;
                 tempkmin = k == minMT-1 ? minM-k*A->nb : A->nb;
                 ldak = BLKLDD(A, k);
@@ -257,6 +263,8 @@ void morse_pzunmlq(MORSE_enum side, MORSE_enum trans,
              *  MorseRight / MorseConjTrans
              */
             for (k = 0; k < minMT; k++) {
+                RUNTIME_set_iteration(k);
+
                 tempkn   = k == B->nt -1 ? B->n -k*B->nb : B->nb;
                 tempkmin = k == minMT-1 ? minM-k*A->mb : A->mb;
                 ldak = BLKLDD(A, k);
diff --git a/compute/pzunmlqrh.c b/compute/pzunmlqrh.c
index 2963bf5537c7b35157d1dba86b640d6db8bc1086..21f1805e1e705fb6bebebc66433c366d7399e58c 100644
--- a/compute/pzunmlqrh.c
+++ b/compute/pzunmlqrh.c
@@ -105,6 +105,8 @@ void morse_pzunmlqrh(MORSE_enum side, MORSE_enum trans,
              *  MorseLeft / MorseNoTrans
              */
             for (k = 0; k < K; k++) {
+                RUNTIME_set_iteration(k);
+
                 tempkm = k == A->mt-1 ? A->m-k*A->mb : A->mb;
                 ldak = BLKLDD(A, k);
                 for (N = k; N < A->nt; N += BS) {
@@ -178,6 +180,8 @@ void morse_pzunmlqrh(MORSE_enum side, MORSE_enum trans,
              *  MorseLeft / MorseConjTrans
              */
             for (k = K-1; k >= 0; k--) {
+                RUNTIME_set_iteration(k);
+
                 tempkm = k == A->mt-1 ? A->m-k*A->mb : A->mb;
                 ldak = BLKLDD(A, k);
                 lastRD = 0;
@@ -257,6 +261,8 @@ void morse_pzunmlqrh(MORSE_enum side, MORSE_enum trans,
              *  MorseRight / MorseNoTrans
              */
             for (k = K-1; k >= 0; k--) {
+                RUNTIME_set_iteration(k);
+
                 tempkm = k == A->mt-1 ? A->m-k*A->mb : A->mb;
                 ldak = BLKLDD(A, k);
                 lastRD = 0;
@@ -332,6 +338,8 @@ void morse_pzunmlqrh(MORSE_enum side, MORSE_enum trans,
              *  MorseRight / MorseConjTrans
              */
             for (k = 0; k < K; k++) {
+                RUNTIME_set_iteration(k);
+
                 tempkm = k == A->mt-1 ? A->m-k*A->mb : A->mb;
                 ldak = BLKLDD(A, k);
                 for (N = k; N < A->nt; N += BS) {
diff --git a/compute/pzunmqr.c b/compute/pzunmqr.c
index f860f7f04b795bcf6f8151084afe49a94ea575f5..4cbcf7b62a2df5620086fb4d15a596580872b916 100644
--- a/compute/pzunmqr.c
+++ b/compute/pzunmqr.c
@@ -105,6 +105,8 @@ void morse_pzunmqr(MORSE_enum side, MORSE_enum trans,
              *  MorseLeft / MorseConjTrans
              */
             for (k = 0; k < minMT; k++) {
+                RUNTIME_set_iteration(k);
+
                 tempkm   = k == B->mt-1 ? B->m-k*B->mb : B->mb;
                 tempkmin = k == minMT-1 ? minM-k*A->nb : A->nb;
                 ldak = BLKLDD(A, k);
@@ -156,6 +158,8 @@ void morse_pzunmqr(MORSE_enum side, MORSE_enum trans,
          */
         else {
             for (k = minMT-1; k >= 0; k--) {
+                RUNTIME_set_iteration(k);
+
                 tempkm = k == B->mt-1 ? B->m-k*B->mb : B->mb;
                 tempkmin = k == minMT-1 ? minM-k*A->nb : A->nb;
                 ldak = BLKLDD(A, k);
@@ -209,6 +213,8 @@ void morse_pzunmqr(MORSE_enum side, MORSE_enum trans,
     else {
         if (trans == MorseConjTrans) {
             for (k = minMT-1; k >= 0; k--) {
+                RUNTIME_set_iteration(k);
+
                 tempkn = k == B->nt-1 ? B->n-k*B->nb : B->nb;
                 tempkmin = k == minMT-1 ? minM-k*A->nb : A->nb;
                 ldak = BLKLDD(A, k);
@@ -261,6 +267,8 @@ void morse_pzunmqr(MORSE_enum side, MORSE_enum trans,
          */
         else {
             for (k = 0; k < minMT; k++) {
+                RUNTIME_set_iteration(k);
+
                 tempkn   = k == B->nt-1 ? B->n-k*B->nb : B->nb;
                 tempkmin = k == minMT-1 ? minM-k*A->nb : A->nb;
                 ldak = BLKLDD(A, k);
diff --git a/compute/pzunmqrrh.c b/compute/pzunmqrrh.c
index 8ef8cb2dc8426db7183ea8b8d5e5d6dd5b76f3a6..62023091c981210bd7c21a8218daa711e3ca7c28 100644
--- a/compute/pzunmqrrh.c
+++ b/compute/pzunmqrrh.c
@@ -107,6 +107,8 @@ void morse_pzunmqrrh(MORSE_enum side, MORSE_enum trans,
              *  MorseLeft / MorseConjTrans
              */
             for (k = 0; k < K; k++) {
+                RUNTIME_set_iteration(k);
+
                 tempkn = k == A->nt-1 ? A->n-k*A->nb : A->nb;
                 for (M = k; M < A->mt; M += BS) {
                     tempMm   = M == A->mt-1 ? A->m-M*A->mb : A->mb;
@@ -182,6 +184,8 @@ void morse_pzunmqrrh(MORSE_enum side, MORSE_enum trans,
              *  MorseLeft / MorseNoTrans
              */
             for (k = K-1; k >= 0; k--) {
+                RUNTIME_set_iteration(k);
+
                 tempkn = k == A->nt-1 ? A->n-k*A->nb : A->nb;
                 lastRD = 0;
                 for (RD = BS; RD < A->mt-k; RD *= 2)
@@ -262,6 +266,8 @@ void morse_pzunmqrrh(MORSE_enum side, MORSE_enum trans,
              *  MorseRight / MorseConjTrans
              */
             for (k = K-1; k >= 0; k--) {
+                RUNTIME_set_iteration(k);
+
                 tempkn = k == A->nt-1 ? A->n-k*A->nb : A->nb;
                 lastRD = 0;
                 for (RD = BS; RD < A->mt-k; RD *= 2)
@@ -340,6 +346,8 @@ void morse_pzunmqrrh(MORSE_enum side, MORSE_enum trans,
              *  MorseRight / MorseNoTrans
              */
             for (k = 0; k < K; k++) {
+                RUNTIME_set_iteration(k);
+
                 tempkn = k == A->nt-1 ? A->n-k*A->nb : A->nb;
                 for (M = k; M < A->mt; M += BS) {
                     tempMm   = M == A->mt-1 ? A->m-M*A->mb : A->mb;
diff --git a/control/config.h.in b/control/config.h.in
index 9d6dbdb0b2a536341357c4610dced4f4893e6e8d..a71d517dcc81c036d9236dce679bebcc31596161 100644
--- a/control/config.h.in
+++ b/control/config.h.in
@@ -34,6 +34,7 @@
 /* StarPU functions */
 #cmakedefine HAVE_STARPU_FXT_PROFILING
 #cmakedefine HAVE_STARPU_IDLE_PREFETCH
+#cmakedefine HAVE_STARPU_SET_ITERATION
 #cmakedefine HAVE_STARPU_DATA_WONT_USE
 #cmakedefine HAVE_STARPU_MALLOC_ON_NODE_SET_DEFAULT_FLAGS
 #cmakedefine HAVE_STARPU_MPI_DATA_REGISTER
diff --git a/include/runtime.h b/include/runtime.h
index 95cf19b75674623160da018bda60c1cbd65ef413..ea765e11213b490f7d6622a7d6d45815d0b430f3 100644
--- a/include/runtime.h
+++ b/include/runtime.h
@@ -52,6 +52,8 @@ int   RUNTIME_rank               (MORSE_context_t*);
 int   RUNTIME_init_scheduler     (MORSE_context_t*, int, int, int);
 void  RUNTIME_finalize_scheduler (MORSE_context_t*);
 void  RUNTIME_barrier            (MORSE_context_t*);
+void  RUNTIME_set_iteration      (MORSE_context_t*, unsigned long iteration);
+void  RUNTIME_set_subiteration   (MORSE_context_t*, unsigned long subiteration);
 void  RUNTIME_pause              (MORSE_context_t*);
 void  RUNTIME_resume             (MORSE_context_t*);
 void  RUNTIME_comm_rank          (int*);
diff --git a/runtime/parsec/control/runtime_control.c b/runtime/parsec/control/runtime_control.c
index edaafbfbef13114d85d66d3e18523b05a68973da..c1d3d9910e0315b2d0e396460d0093fa8b5764e5 100644
--- a/runtime/parsec/control/runtime_control.c
+++ b/runtime/parsec/control/runtime_control.c
@@ -67,6 +67,20 @@ void RUNTIME_barrier(MORSE_context_t *morse)
     return;
 }
 
+/*******************************************************************************
+ *  Set iteration numbers for traces
+ **/
+void RUNTIME_set_iteration( MORSE_context_t *morse, unsigned long iteration )
+{
+    (void)morse;
+    return;
+}
+void RUNTIME_set_subiteration( MORSE_context_t *morse, unsigned long subiteration )
+{
+    (void)morse;
+    return;
+}
+
 /*******************************************************************************
  *  To suspend the processing of new tasks by workers
  **/
diff --git a/runtime/quark/control/runtime_control.c b/runtime/quark/control/runtime_control.c
index 2ca4d060ce7177339bfc926edfee89be3526d7d0..3a9be224e0a351f174a317754fec190126c3de01 100644
--- a/runtime/quark/control/runtime_control.c
+++ b/runtime/quark/control/runtime_control.c
@@ -68,6 +68,20 @@ void RUNTIME_finalize_scheduler(MORSE_context_t *morse)
     return;
 }
 
+/*******************************************************************************
+ *  Set iteration numbers for traces
+ **/
+void RUNTIME_set_iteration( MORSE_context_t *morse, unsigned long iteration )
+{
+    (void)morse;
+    return;
+}
+void RUNTIME_set_subiteration( MORSE_context_t *morse, unsigned long subiteration )
+{
+    (void)morse;
+    return;
+}
+
 /*******************************************************************************
  *  To suspend the processing of new tasks by workers
  **/
diff --git a/runtime/starpu/control/runtime_control.c b/runtime/starpu/control/runtime_control.c
index eb1cbb646c25a237d594bade6b64b74fadfd60dc..b1aba1933b89e79f03d53cb3a30f30988779824a 100644
--- a/runtime/starpu/control/runtime_control.c
+++ b/runtime/starpu/control/runtime_control.c
@@ -175,6 +175,24 @@ void RUNTIME_barrier( MORSE_context_t *morse )
 #endif
 }
 
+/*******************************************************************************
+ *  Set iteration numbers for traces
+ **/
+void RUNTIME_set_iteration( MORSE_context_t *morse, unsigned long iteration )
+{
+    (void)morse;
+#if defined(HAVE_STARPU_SET_ITERATION)
+    starpu_set_iteration(iteration);
+#endif
+}
+void RUNTIME_set_subiteration( MORSE_context_t *morse, unsigned long subiteration )
+{
+    (void)morse;
+#if defined(HAVE_STARPU_SET_ITERATION)
+    starpu_set_subiteration(subiteration);
+#endif
+}
+
 /*******************************************************************************
  *  To suspend the processing of new tasks by workers
  **/