diff --git a/compute/zgetrf.c b/compute/zgetrf.c
index 0a3682b20c929bbf8268bfff0405067e346c92a4..9b002f5a6329a75fdf06758ae813c479f6b69b09 100644
--- a/compute/zgetrf.c
+++ b/compute/zgetrf.c
@@ -280,7 +280,7 @@ CHAMELEON_zgetrf( int M, int N, CHAMELEON_Complex64_t *A, int LDA, int *IPIV )
     if ( ( ws->alg == ChamGetrfPPivPerColumn ) ||
          ( ws->alg == ChamGetrfPPiv ) )
     {
-        RUNTIME_ipiv_gather( &descIPIV, IPIV, 0 );
+        RUNTIME_ipiv_gather( sequence, &descIPIV, IPIV, 0 );
     }
     chameleon_sequence_wait( chamctxt, sequence );
 
diff --git a/control/descriptor.c b/control/descriptor.c
index ea6b712d10191d424fa73de9ef432f1dbf0f697d..3f753f2b98b5ea3c1ea69c9644d2a2e0d28884ed 100644
--- a/control/descriptor.c
+++ b/control/descriptor.c
@@ -333,7 +333,7 @@ int chameleon_desc_init_internal( CHAM_desc_t *desc, const char *name, void *mat
     chameleon_desc_init_tiles( desc, desc->get_rankof_init );
 
     /* Create runtime specific structure like registering data */
-    RUNTIME_desc_create( desc );
+    RUNTIME_desc_create( chamctxt, desc );
 
     return rc;
 }
diff --git a/control/descriptor_ipiv.c b/control/descriptor_ipiv.c
index 784a0ef7b5595ce2ec8870b7d8de82f134e7ed01..720230dcad37f52616b237cfc5e36a36e84ad762 100644
--- a/control/descriptor_ipiv.c
+++ b/control/descriptor_ipiv.c
@@ -73,7 +73,7 @@ int chameleon_ipiv_init( CHAM_ipiv_t *ipiv, const CHAM_desc_t *desc, void *data
     ipiv->mt   = chameleon_ceil( ipiv->m, ipiv->mb );
 
     /* Create runtime specific structure like registering data */
-    RUNTIME_ipiv_create( ipiv );
+    RUNTIME_ipiv_create( chamctxt, ipiv );
 
     return rc;
 }
@@ -240,6 +240,13 @@ int CHAMELEON_Ipiv_Flush( const CHAM_ipiv_t        *ipiv,
  */
 int CHAMELEON_Ipiv_Gather( CHAM_ipiv_t *ipivdesc, int *ipiv, int root )
 {
-    RUNTIME_ipiv_gather( ipivdesc, ipiv, root );
-    return CHAMELEON_SUCCESS;
+    int status;
+    CHAM_context_t *chamctxt = chameleon_context_self();
+    RUNTIME_sequence_t *sequence = NULL;
+    chameleon_sequence_create( chamctxt, &sequence );
+    RUNTIME_ipiv_gather( sequence, ipivdesc, ipiv, root );
+    chameleon_sequence_wait( chamctxt, sequence );
+    status = sequence->status;
+    chameleon_sequence_destroy( chamctxt, sequence );
+    return status;
 }
diff --git a/example/lapack_to_chameleon/step7.h b/example/lapack_to_chameleon/step7.h
index b693e1920b810d596f6958bc2296b3118a10576f..80c1a89f232725ebec3b29b0e1b7a9b11d938d7c 100644
--- a/example/lapack_to_chameleon/step7.h
+++ b/example/lapack_to_chameleon/step7.h
@@ -86,6 +86,7 @@ static int Cham_build_plgsy_cpu( void *op_args, cham_uplo_t uplo, int m, int n,
     tempmm = (m == (descA->mt-1)) ? (descA->m - m * descA->mb) : descA->mb;
     tempnn = (n == (descA->nt-1)) ? (descA->n - n * descA->nb) : descA->nb;
 
+    /* fill the tile with the coreblas function plgsy = random SPD matrix generator */
     TCORE_dplgsy( data->bump, tempmm, tempnn, tileA,
                   descA->m, m * descA->mb, n * descA->nb, data->seed );
 
@@ -103,6 +104,7 @@ static int Cham_build_plrnt_cpu( void *op_args, cham_uplo_t uplo, int m, int n,
     tempmm = (m == (descA->mt-1)) ? (descA->m - m * descA->mb) : descA->mb;
     tempnn = (n == (descA->nt-1)) ? (descA->n - n * descA->nb) : descA->nb;
 
+    /* fill the tile with the coreblas function plrnt = random general matrix generator */
     TCORE_dplrnt( tempmm, tempnn, tileA,
                   descA->m, m * descA->mb, n * descA->nb, data->seed );
 
diff --git a/include/chameleon/runtime.h b/include/chameleon/runtime.h
index 7a39e2f2d6d75caec2282758198e6f0d1ea1680a..94c985cdeb4832614c0e6119fc2dbcad8de3b3a7 100644
--- a/include/chameleon/runtime.h
+++ b/include/chameleon/runtime.h
@@ -409,11 +409,14 @@ RUNTIME_free( void *ptr, size_t size );
  ***
  * @brief Initialize runtime specific data structure to a given descriptor.
  *
+ * @param[in] chamctxt
+ *            The chameleon context.
+ *
  * @param[in,out] desc
  *            The descriptor to initialize.
  */
 void
-RUNTIME_desc_create( CHAM_desc_t *desc );
+RUNTIME_desc_create( CHAM_context_t *chamctxt, CHAM_desc_t *desc );
 
 /**
  * @brief Finalize runtime specific data structure of a given descriptor.
@@ -705,11 +708,13 @@ void RUNTIME_ddisplay_oneprofile (cham_tasktype_t task);
 void RUNTIME_sdisplay_allprofile ();
 void RUNTIME_sdisplay_oneprofile (cham_tasktype_t task);
 
-void RUNTIME_ipiv_create ( CHAM_ipiv_t *ipiv );
+void RUNTIME_ipiv_create ( CHAM_context_t *chamctxt,
+                           CHAM_ipiv_t *ipiv );
 void RUNTIME_ipiv_destroy( CHAM_ipiv_t *ipiv );
 void RUNTIME_ipiv_init   ( const RUNTIME_sequence_t *sequence,
                            CHAM_ipiv_t *ipiv );
-void RUNTIME_ipiv_gather ( CHAM_ipiv_t *desc, int *ipiv, int node );
+void RUNTIME_ipiv_gather ( const RUNTIME_sequence_t *sequence,
+                           CHAM_ipiv_t *desc, int *ipiv, int node );
 
 void *RUNTIME_ipiv_getaddr   ( const CHAM_ipiv_t *ipiv, int m );
 void *RUNTIME_nextpiv_getaddr( const CHAM_ipiv_t *ipiv, int m, int h );
diff --git a/runtime/openmp/control/runtime_descriptor.c b/runtime/openmp/control/runtime_descriptor.c
index 9ba8255423d6950dcaaf209f4af057d8b2c47849..7b81721539f65c800ca52a900f494dbe53c8cf07 100644
--- a/runtime/openmp/control/runtime_descriptor.c
+++ b/runtime/openmp/control/runtime_descriptor.c
@@ -34,8 +34,9 @@ void RUNTIME_free( void  *ptr,
     return;
 }
 
-void RUNTIME_desc_create( CHAM_desc_t *desc )
+void RUNTIME_desc_create( CHAM_context_t *chamctxt, CHAM_desc_t *desc )
 {
+    (void)chamctxt;
     (void)desc;
     return;
 }
diff --git a/runtime/openmp/control/runtime_descriptor_ipiv.c b/runtime/openmp/control/runtime_descriptor_ipiv.c
index 33b03458ff152a118c2cf087ebd8b52b10a13496..7b04c0aecb4816db288770a0dbb76cd3b71beb30 100644
--- a/runtime/openmp/control/runtime_descriptor_ipiv.c
+++ b/runtime/openmp/control/runtime_descriptor_ipiv.c
@@ -17,9 +17,11 @@
  */
 #include "chameleon_openmp.h"
 
-void RUNTIME_ipiv_create( CHAM_ipiv_t *ipiv )
+void RUNTIME_ipiv_create( CHAM_context_t *chamctxt,
+                          CHAM_ipiv_t *ipiv )
 {
     assert( 0 );
+    (void)chamctxt;
     (void)ipiv;
 }
 
@@ -115,9 +117,11 @@ void RUNTIME_ipiv_init( const RUNTIME_sequence_t *sequence,
     (void)ipiv;
 }
 
-void RUNTIME_ipiv_gather( CHAM_ipiv_t *desc, int *ipiv, int node )
+void RUNTIME_ipiv_gather( const RUNTIME_sequence_t *sequence,
+                          CHAM_ipiv_t *desc, int *ipiv, int node )
 {
     assert( 0 );
+    (void)sequence;
     (void)desc;
     (void)ipiv;
     (void)node;
diff --git a/runtime/parsec/control/runtime_descriptor.c b/runtime/parsec/control/runtime_descriptor.c
index a52a37f08ab2da9dbf775596ad2defd4f7e5c137..609f4ac90f761cd8b26a63b6ebf0c566a6ed141f 100644
--- a/runtime/parsec/control/runtime_descriptor.c
+++ b/runtime/parsec/control/runtime_descriptor.c
@@ -198,8 +198,9 @@ chameleon_parsec_key_to_string(parsec_data_collection_t *data_collection, parsec
 /**
  *  Create data descriptor
  */
-void RUNTIME_desc_create( CHAM_desc_t *mdesc )
+void RUNTIME_desc_create( CHAM_context_t *chamctxt, CHAM_desc_t *mdesc )
 {
+    (void)chamctxt;
     parsec_data_collection_t *data_collection;
     chameleon_parsec_desc_t *pdesc;
     int comm_size;
diff --git a/runtime/parsec/control/runtime_descriptor_ipiv.c b/runtime/parsec/control/runtime_descriptor_ipiv.c
index 2cfc2c6a2a27e33c52aeaacd8726e2b4a864e91e..d3f9e19979a2875e9133a1aebbc8cca30ff6c726 100644
--- a/runtime/parsec/control/runtime_descriptor_ipiv.c
+++ b/runtime/parsec/control/runtime_descriptor_ipiv.c
@@ -17,9 +17,11 @@
  */
 #include "chameleon_parsec.h"
 
-void RUNTIME_ipiv_create( CHAM_ipiv_t *ipiv )
+void RUNTIME_ipiv_create( CHAM_context_t *chamctxt,
+                          CHAM_ipiv_t *ipiv )
 {
     assert( 0 );
+    (void)chamctxt;
     (void)ipiv;
 }
 
@@ -115,9 +117,11 @@ void RUNTIME_ipiv_init( const RUNTIME_sequence_t *sequence,
     (void)ipiv;
 }
 
-void RUNTIME_ipiv_gather( CHAM_ipiv_t *desc, int *ipiv, int node )
+void RUNTIME_ipiv_gather( const RUNTIME_sequence_t *sequence,
+                          CHAM_ipiv_t *desc, int *ipiv, int node )
 {
     assert( 0 );
+    (void)sequence;
     (void)desc;
     (void)ipiv;
     (void)node;
diff --git a/runtime/quark/control/runtime_descriptor.c b/runtime/quark/control/runtime_descriptor.c
index 2676e02e88ae70a4f9dd6e238211295f53130ebb..f15668a2464671402f843d0cdbfd9c0b13f897da 100644
--- a/runtime/quark/control/runtime_descriptor.c
+++ b/runtime/quark/control/runtime_descriptor.c
@@ -35,8 +35,9 @@ void RUNTIME_free( void  *ptr,
     return;
 }
 
-void RUNTIME_desc_create( CHAM_desc_t *desc )
+void RUNTIME_desc_create( CHAM_context_t *chamctxt, CHAM_desc_t *desc )
 {
+    (void)chamctxt;
     (void)desc;
     return;
 }
diff --git a/runtime/quark/control/runtime_descriptor_ipiv.c b/runtime/quark/control/runtime_descriptor_ipiv.c
index dd22e55d8cefc50f0aeab265d751502deb223026..9e8cdbb00bdca4c7b774ff1a3eeb239f6a8bd913 100644
--- a/runtime/quark/control/runtime_descriptor_ipiv.c
+++ b/runtime/quark/control/runtime_descriptor_ipiv.c
@@ -17,9 +17,11 @@
  */
 #include "chameleon_quark.h"
 
-void RUNTIME_ipiv_create( CHAM_ipiv_t *ipiv )
+void RUNTIME_ipiv_create( CHAM_context_t *chamctxt,
+                          CHAM_ipiv_t *ipiv )
 {
     assert( 0 );
+    (void)chamctxt;
     (void)ipiv;
 }
 
@@ -115,9 +117,11 @@ void RUNTIME_ipiv_init( const RUNTIME_sequence_t *sequence,
     (void)ipiv;
 }
 
-void RUNTIME_ipiv_gather( CHAM_ipiv_t *desc, int *ipiv, int node )
+void RUNTIME_ipiv_gather( const RUNTIME_sequence_t *sequence,
+                          CHAM_ipiv_t *desc, int *ipiv, int node )
 {
     assert( 0 );
+    (void)sequence;
     (void)desc;
     (void)ipiv;
     (void)node;
diff --git a/runtime/starpu/control/runtime_descriptor.c b/runtime/starpu/control/runtime_descriptor.c
index 56210c3090a470e6231609fd74d4fa2fe0f85815..ecfd88d0fd509c2c4619473d343ed542701460a3 100644
--- a/runtime/starpu/control/runtime_descriptor.c
+++ b/runtime/starpu/control/runtime_descriptor.c
@@ -82,7 +82,7 @@ void RUNTIME_free( void  *ptr,
 /**
  *  Create data descriptor
  */
-void RUNTIME_desc_create( CHAM_desc_t *desc )
+void RUNTIME_desc_create( CHAM_context_t *chamctxt, CHAM_desc_t *desc )
 {
     int64_t lmt = desc->lmt;
     int64_t lnt = desc->lnt;
@@ -149,7 +149,7 @@ void RUNTIME_desc_create( CHAM_desc_t *desc )
      * Book the number of tags required to describe this matrix
      */
     {
-        chameleon_starpu_tag_init();
+        chameleon_starpu_tag_init( chamctxt );
         desc->mpitag = chameleon_starpu_tag_book( nbtiles );
 
         if ( desc->mpitag == -1 ) {
diff --git a/runtime/starpu/control/runtime_descriptor_ipiv.c b/runtime/starpu/control/runtime_descriptor_ipiv.c
index 9806d0dbb1c6bfd9a6a3c750d7779248db2059f5..f6cdf950b431090f8ad98501057ba6a627792d3d 100644
--- a/runtime/starpu/control/runtime_descriptor_ipiv.c
+++ b/runtime/starpu/control/runtime_descriptor_ipiv.c
@@ -20,7 +20,8 @@
 /**
  *  Create ws_pivot runtime structures
  */
-void RUNTIME_ipiv_create( CHAM_ipiv_t *ipiv )
+void RUNTIME_ipiv_create( CHAM_context_t *chamctxt,
+                          CHAM_ipiv_t *ipiv )
 {
     assert( ipiv );
     starpu_data_handle_t *handles = calloc( 5 * ipiv->mt, sizeof(starpu_data_handle_t) );
@@ -39,7 +40,7 @@ void RUNTIME_ipiv_create( CHAM_ipiv_t *ipiv )
      * One per handle type
      */
     {
-        chameleon_starpu_tag_init();
+        chameleon_starpu_tag_init( chamctxt );
         ipiv->mpitag_ipiv = chameleon_starpu_tag_book( (int64_t)(ipiv->mt) * 5 );
         if ( ipiv->mpitag_ipiv == -1 ) {
             chameleon_fatal_error("RUNTIME_ipiv_create", "Can't pursue computation since no more tags are available for ipiv structure");
@@ -365,12 +366,12 @@ void RUNTIME_ipiv_init( const RUNTIME_sequence_t *sequence,
     }
 }
 
-void RUNTIME_ipiv_gather( CHAM_ipiv_t *desc, int *ipiv, int node )
+void RUNTIME_ipiv_gather( const RUNTIME_sequence_t *sequence,
+                          CHAM_ipiv_t *desc, int *ipiv, int node )
 {
     int64_t mt   = desc->mt;
     int64_t mb   = desc->mb;
     int64_t tag  = chameleon_starpu_tag_book( (int64_t)(desc->mt) );
-    CHAM_context_t *chamctxt = chameleon_context_self();
     int     rank = CHAMELEON_Comm_rank();
     int     owner = rank;
     int     m;
@@ -390,7 +391,7 @@ void RUNTIME_ipiv_gather( CHAM_ipiv_t *desc, int *ipiv, int node )
                 if (already_received == 0)
                 {
                     MPI_Status status;
-                    starpu_mpi_recv( ipiv_src, owner, tag, chamctxt->comm, &status );
+                    starpu_mpi_recv( ipiv_src, owner, tag, sequence->comm, &status );
                 }
             }
             else if ( rank == owner )
@@ -399,7 +400,7 @@ void RUNTIME_ipiv_gather( CHAM_ipiv_t *desc, int *ipiv, int node )
                 int already_sent = starpu_mpi_cached_send_set( ipiv_src, node );
                 if (already_sent == 0)
                 {
-                    starpu_mpi_send( ipiv_src, node, tag, chamctxt->comm );
+                    starpu_mpi_send( ipiv_src, node, tag, sequence->comm );
                 }
             }
         }
diff --git a/runtime/starpu/control/runtime_tags.c b/runtime/starpu/control/runtime_tags.c
index e8d8c6628bebfd775de013a25efa21c77e87b903..a5c1bc2084276fefe1c6f97f7654144f466c41cc 100644
--- a/runtime/starpu/control/runtime_tags.c
+++ b/runtime/starpu/control/runtime_tags.c
@@ -52,13 +52,12 @@ static int64_t starpu_tag_ub = 0;
  *
  ******************************************************************************/
 void
-chameleon_starpu_tag_init( void )
+chameleon_starpu_tag_init( CHAM_context_t *chamctxt )
 {
     if (!starpu_tag_ub) {
         int          ok       = 0;
         void        *tag_ub_p = NULL;
 
-        CHAM_context_t *chamctxt = chameleon_context_self();
         starpu_mpi_comm_get_attr( chamctxt->comm, STARPU_MPI_TAG_UB, &tag_ub_p, &ok );
         starpu_tag_ub = (uint64_t)((intptr_t)tag_ub_p);
 
@@ -211,7 +210,8 @@ chameleon_starpu_tag_release( int64_t min )
  *
  ******************************************************************************/
 void
-chameleon_starpu_tag_init( ) {
+chameleon_starpu_tag_init( CHAM_context_t *chamctxt ) {
+    (void)chamctxt;
     return;
 }
 
diff --git a/runtime/starpu/include/chameleon_starpu.h.in b/runtime/starpu/include/chameleon_starpu.h.in
index b102e34419dc377643f6a1f5226672420f95fd7e..bbaf1bbdb67b5027e73a3b04d15c6cb4ea7c682a 100644
--- a/runtime/starpu/include/chameleon_starpu.h.in
+++ b/runtime/starpu/include/chameleon_starpu.h.in
@@ -159,7 +159,7 @@ void *RUNTIME_data_getaddr_withconversion( const RUNTIME_option_t *options,
 /**
  * MPI tag management
  */
-void    chameleon_starpu_tag_init( );
+void    chameleon_starpu_tag_init( CHAM_context_t *chamctxt );
 int64_t chameleon_starpu_tag_book( int64_t nbtags );
 void    chameleon_starpu_tag_release( int64_t min );