diff --git a/compute/ztile.c b/compute/ztile.c
index b4c3b536725994387c5e18676e054035b3cdfd83..74d85e06e54a6652b19d06d7fd68abb0150db727 100644
--- a/compute/ztile.c
+++ b/compute/ztile.c
@@ -120,7 +120,7 @@ int CHAMELEON_zLap2Desc( cham_uplo_t uplo, CHAMELEON_Complex64_t *Af77, int LDA,
 {
     CHAM_context_t *chamctxt;
     RUNTIME_sequence_t *sequence = NULL;
-    RUNTIME_request_t request;
+    RUNTIME_request_t request = RUNTIME_REQUEST_INITIALIZER;
     CHAM_desc_t *B;
     int status;
 
@@ -204,7 +204,7 @@ int CHAMELEON_zDesc2Lap( cham_uplo_t uplo, CHAM_desc_t *A, CHAMELEON_Complex64_t
 {
     CHAM_context_t *chamctxt;
     RUNTIME_sequence_t *sequence = NULL;
-    RUNTIME_request_t request;
+    RUNTIME_request_t request = RUNTIME_REQUEST_INITIALIZER;
     CHAM_desc_t *B;
     int status;
 
diff --git a/control/async.c b/control/async.c
index 06157246736c0d4ae1629e0e36195f0d0ff77e2c..fc9c695a9e025c348afe2e9f001f4f6cfd6b886a 100644
--- a/control/async.c
+++ b/control/async.c
@@ -208,3 +208,139 @@ int CHAMELEON_Sequence_Flush(RUNTIME_sequence_t *sequence, RUNTIME_request_t *re
 
     return CHAMELEON_SUCCESS;
 }
+
+
+/**
+ *  Create a request
+ */
+int chameleon_request_create(CHAM_context_t *chamctxt, RUNTIME_request_t **request)
+{
+    if ((*request = malloc(sizeof(RUNTIME_request_t))) == NULL) {
+        chameleon_error("chameleon_request_create", "malloc() failed");
+        return CHAMELEON_ERR_OUT_OF_RESOURCES;
+    }
+
+    RUNTIME_request_create( chamctxt, *request );
+
+    (*request)->status = CHAMELEON_SUCCESS;
+    return CHAMELEON_SUCCESS;
+}
+
+/**
+ *  Destroy a request
+ */
+int chameleon_request_destroy(CHAM_context_t *chamctxt, RUNTIME_request_t *request)
+{
+    RUNTIME_request_destroy( chamctxt, request );
+    free(request);
+    return CHAMELEON_SUCCESS;
+}
+
+/**
+ *  Set parameter for a request
+ */
+int chameleon_request_set(CHAM_context_t *chamctxt, RUNTIME_request_t *request, int param, int value)
+{
+    int status;
+    status = RUNTIME_request_set( chamctxt, request, param, value );
+    return status;
+}
+
+/**
+ *
+ * @ingroup Requests
+ *
+ *  CHAMELEON_Request_Create - Create a request.
+ *
+ ******************************************************************************
+ *
+ * @param[out] request
+ *          Identifies a request for a specific routine.
+ *
+ ******************************************************************************
+ *
+ * @retval CHAMELEON_SUCCESS successful exit
+ *
+ */
+int CHAMELEON_Request_Create(RUNTIME_request_t **request)
+{
+    CHAM_context_t *chamctxt;
+    int status;
+
+    chamctxt = chameleon_context_self();
+    if (chamctxt == NULL) {
+        chameleon_fatal_error("CHAMELEON_Request_Create", "CHAMELEON not initialized");
+        return CHAMELEON_ERR_NOT_INITIALIZED;
+    }
+    status = chameleon_request_create(chamctxt, request);
+    return status;
+}
+
+/**
+ *
+ * @ingroup Requests
+ *
+ *  CHAMELEON_Request_Destroy - Destroy a request.
+ *
+ ******************************************************************************
+ *
+ * @param[in] request
+ *          Identifies a request for a specific routine.
+ *
+ ******************************************************************************
+ *
+ * @retval CHAMELEON_SUCCESS successful exit
+ *
+ */
+int CHAMELEON_Request_Destroy(RUNTIME_request_t *request)
+{
+    CHAM_context_t *chamctxt;
+    int status;
+
+    chamctxt = chameleon_context_self();
+    if (chamctxt == NULL) {
+        chameleon_fatal_error("CHAMELEON_Request_Destroy", "CHAMELEON not initialized");
+        return CHAMELEON_ERR_NOT_INITIALIZED;
+    }
+    if (request == NULL) {
+        chameleon_fatal_error("CHAMELEON_Request_Destroy", "NULL request");
+        return CHAMELEON_ERR_UNALLOCATED;
+    }
+    status = chameleon_request_destroy(chamctxt, request);
+    return status;
+}
+
+/**
+ *
+ * @ingroup Requests
+ *
+ *  CHAMELEON_Request_Set - Set CHAMELEON parameter for a request.
+ *
+ *******************************************************************************
+ *
+ * @param[in] param
+ *          Feature to be enabled:
+ *          @arg CHAMELEON_REQUEST_WORKERID: force tasks execution on a specific worker id
+ *
+ * @param[in] value
+ *          Value of the parameter.
+ *
+ *******************************************************************************
+ *
+ * @retval CHAMELEON_SUCCESS successful exit
+ *
+ */
+int CHAMELEON_Request_Set( RUNTIME_request_t *request, int param, int value)
+{
+    CHAM_context_t *chamctxt;
+    int status;
+
+    chamctxt = chameleon_context_self();
+    if (chamctxt == NULL) {
+        chameleon_error("CHAMELEON_Request_Set", "CHAMELEON not initialized");
+        return CHAMELEON_ERR_NOT_INITIALIZED;
+    }
+
+    status = chameleon_request_set(chamctxt, request, param, value);
+    return status;
+}
\ No newline at end of file
diff --git a/control/async.h b/control/async.h
index be521ae68f37c12ea0859f0f0bb77295f43e3fa6..5da5c1c6c1d2b2063b94987c84f80b8b7cc5e958 100644
--- a/control/async.h
+++ b/control/async.h
@@ -33,6 +33,9 @@ int chameleon_request_fail     (RUNTIME_sequence_t *sequence, RUNTIME_request_t
 int chameleon_sequence_create  (CHAM_context_t *CHAMELEON, RUNTIME_sequence_t **sequence);
 int chameleon_sequence_destroy (CHAM_context_t *CHAMELEON, RUNTIME_sequence_t *sequence);
 int chameleon_sequence_wait    (CHAM_context_t *CHAMELEON, RUNTIME_sequence_t *sequence);
+int chameleon_request_create   (CHAM_context_t *CHAMELEON, RUNTIME_request_t **request);
+int chameleon_request_destroy  (CHAM_context_t *CHAMELEON, RUNTIME_request_t *request);
+int chameleon_request_set      (CHAM_context_t *chamctxt, RUNTIME_request_t *request, int param, int value);
 
 #ifdef __cplusplus
 }
diff --git a/control/chameleon_f90.f90 b/control/chameleon_f90.f90
index db2b926fc274cb9fcace33d9478eed42e3e31042..587be5698df4227144adc8a125a710f3adb41f4e 100644
--- a/control/chameleon_f90.f90
+++ b/control/chameleon_f90.f90
@@ -310,6 +310,35 @@ module chameleon
          end function CHAMELEON_Sequence_Flush_c
       end interface
 
+      interface
+         function CHAMELEON_Request_Create_c(req) &
+          & bind(c, name='CHAMELEON_Request_Create')
+            use iso_c_binding
+            integer(kind=c_int) :: CHAMELEON_Request_Create_c
+            type(c_ptr) :: req
+         end function CHAMELEON_Request_Create_c
+      end interface
+
+      interface
+         function CHAMELEON_Request_Destroy_c(req) &
+          & bind(c, name='CHAMELEON_Request_Destroy')
+            use iso_c_binding
+            integer(kind=c_int) :: CHAMELEON_Request_Destroy_c
+            type(c_ptr), value :: req
+         end function CHAMELEON_Request_Destroy_c
+      end interface
+
+      interface
+         function CHAMELEON_Request_Set_c(req, param, pval) &
+          & bind(c, name='CHAMELEON_Request_Set')
+            use iso_c_binding
+            integer(kind=c_int) :: CHAMELEON_Request_Set_c
+            type(c_ptr) :: req
+            integer(kind=c_int), value :: param
+            integer(kind=c_int), value :: pval
+         end function CHAMELEON_Request_Set_c
+      end interface
+
       interface chameleon_lapack_to_tile
          module procedure chameleon_lapack_to_tile_s
          module procedure chameleon_lapack_to_tile_d
@@ -591,4 +620,20 @@ module chameleon
       info = chameleon_sequence_flush_c(sequence,request)
    end subroutine chameleon_sequence_flush
 
+   subroutine chameleon_request_create(request,info)
+      use iso_c_binding
+      implicit none
+      type(c_ptr), intent(out) :: request
+      integer(kind=c_int), intent(out) :: info
+      info = chameleon_request_create_c(request)
+   end subroutine chameleon_request_create
+
+   subroutine chameleon_request_destroy(request,info)
+      use iso_c_binding
+      implicit none
+      type(c_ptr), intent(in) :: request
+      integer(kind=c_int), intent(out) :: info
+      info = chameleon_request_destroy_c(request)
+   end subroutine chameleon_request_destroy
+
 end module chameleon
diff --git a/include/chameleon.h b/include/chameleon.h
index 953bd31cd4216f61ddac97313636d8c4b10be672..ac4c8a8ca521af9b5d01a9d1a07f61a10a0adf06 100644
--- a/include/chameleon.h
+++ b/include/chameleon.h
@@ -145,6 +145,12 @@ void CHAMELEON_user_tag_size(int, int);
 int CHAMELEON_Sequence_Create  (RUNTIME_sequence_t **sequence);
 int CHAMELEON_Sequence_Destroy (RUNTIME_sequence_t *sequence);
 int CHAMELEON_Sequence_Wait    (RUNTIME_sequence_t *sequence);
+int CHAMELEON_Sequence_Flush   (RUNTIME_sequence_t *sequence, RUNTIME_request_t *request);
+
+/* Requests */
+int CHAMELEON_Request_Create  (RUNTIME_request_t **request);
+int CHAMELEON_Request_Destroy (RUNTIME_request_t *request);
+int CHAMELEON_Request_Set     (RUNTIME_request_t *request, int param, int value);
 
 /**
  *
diff --git a/include/chameleon/constants.h b/include/chameleon/constants.h
index 47e45a1cbb6a37780216c82aa1284a9f587ee725..a75a907066287231407832def05eeaf1290aefe6 100644
--- a/include/chameleon/constants.h
+++ b/include/chameleon/constants.h
@@ -216,6 +216,11 @@ typedef enum chameleon_store_e {
 #define CHAMELEON_TRANSLATION_MODE  7
 #define CHAMELEON_LOOKAHEAD         8
 
+/**
+ *  CHAMELEON constants - configuration parameters for a request
+ */
+#define CHAMELEON_REQUEST_WORKERID 1
+
 /**
  * @brief QR/LQ factorization trees
  */
diff --git a/include/chameleon/runtime.h b/include/chameleon/runtime.h
index ce2e5b5af51243a06ad4946c1b0d818f7c1847b9..aac25cb7d5f80242867da5a83f3e748aa5e7c4a8 100644
--- a/include/chameleon/runtime.h
+++ b/include/chameleon/runtime.h
@@ -310,6 +310,78 @@ RUNTIME_sequence_flush( CHAM_context_t     *ctxt,
                         RUNTIME_request_t  *request,
                         int                 status );
 
+/**
+ * @}
+ *
+ * @name RUNTIME Asynchonous functionalities
+ * @{
+ *    These functions manage the request of tasks. A request is a subset of
+ *    related tasks belonging to a same procedure.
+ */
+
+/**
+ * @brief Create a request structure associated to a given context.
+ *
+ * @param[in] ctxt
+ *            The runtime context in which the request is created.
+ *
+ * @param[in,out] request
+ *            On entry the allocated runtime request structure, and on exit
+ *            the scheduler specifics for the request have been initialized.
+ *
+ * @retval CHAMELEON_SUCCESS on success.
+ * @retval CHAMELEON_ERR_OUT_OF_RESOURCES, if the request could not be created.
+ */
+int
+RUNTIME_request_create( CHAM_context_t    *ctxt,
+                        RUNTIME_request_t *request );
+
+/**
+ * @brief Destroy the request structure.
+ *
+ * @param[in] ctxt
+ *            The runtime context to which the request belongs.
+ *
+ * @param[in,out] request
+ *            On entry the request structure.
+ *            On exit, the scheduler specifics of the request have been
+ *            destroyed.
+ *
+ * @retval CHAMELEON_SUCCESS on success.
+ */
+int
+RUNTIME_request_destroy( CHAM_context_t    *ctxt,
+                         RUNTIME_request_t *request);
+
+/**
+ *  @brief RUNTIME_request_set - Set RUNTIME parameter for a request.
+ *
+ *******************************************************************************
+ *
+ * @param[in] ctxt
+ *            The runtime context to which the request belongs.
+ *
+ * @param[in,out] request
+ *            On entry the request structure.
+ *            On exit, the request structure modified.
+ *
+ * @param[in] param
+ *          Feature to be enabled:
+ *          @arg CHAMELEON_REQUEST_WORKERID: force tasks execution on a specific worker id
+ *
+ * @param[in] value
+ *          Value of the parameter.
+ *
+ *******************************************************************************
+ *
+ * @retval CHAMELEON_SUCCESS successful exit
+ *
+ */
+int
+RUNTIME_request_set( CHAM_context_t  *chamctxt,
+                     RUNTIME_request_t *request,
+                     int param, int value );
+
 /**
  * @}
  *
diff --git a/include/chameleon/runtime_struct.h b/include/chameleon/runtime_struct.h
index 44bc95e60c87de30f330209a42cc6af1f4d7e637..96a8c5cb7b7d599474ec3599b4ce78d2a024a47b 100644
--- a/include/chameleon/runtime_struct.h
+++ b/include/chameleon/runtime_struct.h
@@ -41,13 +41,14 @@ typedef enum runtime_id_e {
  *
  */
 typedef struct runtime_request_s {
-    int       status;   /**< Return status registered by the tasks for the request */
+    int       status; /**< Return status registered by the tasks for the request */
+    void      *schedopt; /**< Specific runtime data pointer to handle the request */
 } RUNTIME_request_t;
 
 /**
  *  @brief Runtime request initializer
  */
-#define RUNTIME_REQUEST_INITIALIZER { 0 }
+#define RUNTIME_REQUEST_INITIALIZER { .status = 0, .schedopt = NULL }
 
 /**
  * @brief RUNTIME sequence structure
diff --git a/runtime/openmp/control/runtime_async.c b/runtime/openmp/control/runtime_async.c
index 7032ec2a966478a351121cc42219bb5b29df163b..42a1d52b1f6cb6506a28f91402ad7b66c9ed3029 100644
--- a/runtime/openmp/control/runtime_async.c
+++ b/runtime/openmp/control/runtime_async.c
@@ -69,3 +69,40 @@ void RUNTIME_sequence_flush( CHAM_context_t  *chamctxt,
     request->status = status;
     return;
 }
+
+/**
+ *  Create a request
+ */
+int RUNTIME_request_create( CHAM_context_t  *chamctxt,
+                            RUNTIME_request_t *request )
+{
+    (void)chamctxt;
+    request->schedopt = NULL;
+    request->status = CHAMELEON_SUCCESS;
+    return CHAMELEON_SUCCESS;
+}
+
+/**
+ *  Destroy a request
+ */
+int RUNTIME_request_destroy( CHAM_context_t  *chamctxt,
+                             RUNTIME_request_t *request )
+{
+    (void)chamctxt;
+    (void)request;
+    return CHAMELEON_SUCCESS;
+}
+
+/**
+ *  Set runtime parameter for a request
+ */
+int RUNTIME_request_set( CHAM_context_t  *chamctxt,
+                         RUNTIME_request_t *request,
+                         int param, int value )
+{
+    (void)chamctxt;
+    (void)request;
+    (void)param;
+    (void)value;
+    return CHAMELEON_SUCCESS;
+}
\ No newline at end of file
diff --git a/runtime/openmp/control/runtime_control.c b/runtime/openmp/control/runtime_control.c
index d07758f47d7eb1d8a34d8b4305f424ebd19f1260..ec955ca19a89ce24867f337739a6260aa89b6881 100644
--- a/runtime/openmp/control/runtime_control.c
+++ b/runtime/openmp/control/runtime_control.c
@@ -38,6 +38,9 @@ int RUNTIME_init( CHAM_context_t *chamctxt,
         chameleon_warning( "RUNTIME_init_scheduler(OpenMP)", "Multi-threaded kernels are not supported for now");
     }
 
+    chamctxt->nworkers = ncpus;
+    chamctxt->nthreads_per_worker = nthreads_per_worker;
+
     return hres;
 }
 
diff --git a/runtime/parsec/control/runtime_async.c b/runtime/parsec/control/runtime_async.c
index 657b2078a72b5015285b07426f142060ea9c8746..af5def990bfb0d7ef031fc52e503d675dcd864b5 100644
--- a/runtime/parsec/control/runtime_async.c
+++ b/runtime/parsec/control/runtime_async.c
@@ -83,3 +83,40 @@ void RUNTIME_sequence_flush( CHAM_context_t  *chamctxt,
     (void)chamctxt;
     return;
 }
+
+/**
+ *  Create a request
+ */
+int RUNTIME_request_create( CHAM_context_t  *chamctxt,
+                            RUNTIME_request_t *request )
+{
+    (void)chamctxt;
+    request->schedopt = NULL;
+    request->status = CHAMELEON_SUCCESS;
+    return CHAMELEON_SUCCESS;
+}
+
+/**
+ *  Destroy a request
+ */
+int RUNTIME_request_destroy( CHAM_context_t  *chamctxt,
+                             RUNTIME_request_t *request )
+{
+    (void)chamctxt;
+    (void)request;
+    return CHAMELEON_SUCCESS;
+}
+
+/**
+ *  Set runtime parameter for a request
+ */
+int RUNTIME_request_set( CHAM_context_t  *chamctxt,
+                         RUNTIME_request_t *request,
+                         int param, int value )
+{
+    (void)chamctxt;
+    (void)request;
+    (void)param;
+    (void)value;
+    return CHAMELEON_SUCCESS;
+}
\ No newline at end of file
diff --git a/runtime/quark/control/runtime_async.c b/runtime/quark/control/runtime_async.c
index f6f466f0223668d5ae8cd9a30a59aea894e643e5..b008c5610508b25f67e8892971480f33714263b0 100644
--- a/runtime/quark/control/runtime_async.c
+++ b/runtime/quark/control/runtime_async.c
@@ -73,3 +73,40 @@ void RUNTIME_sequence_flush( CHAM_context_t  *chamctxt,
     QUARK_Sequence_Cancel( (Quark*)(chamctxt),
                            (Quark_Sequence *)(sequence->schedopt) );
 }
+
+/**
+ *  Create a request
+ */
+int RUNTIME_request_create( CHAM_context_t  *chamctxt,
+                            RUNTIME_request_t *request )
+{
+    (void)chamctxt;
+    request->schedopt = NULL;
+    request->status = CHAMELEON_SUCCESS;
+    return CHAMELEON_SUCCESS;
+}
+
+/**
+ *  Destroy a request
+ */
+int RUNTIME_request_destroy( CHAM_context_t  *chamctxt,
+                             RUNTIME_request_t *request )
+{
+    (void)chamctxt;
+    (void)request;
+    return CHAMELEON_SUCCESS;
+}
+
+/**
+ *  Set runtime parameter for a request
+ */
+int RUNTIME_request_set( CHAM_context_t  *chamctxt,
+                         RUNTIME_request_t *request,
+                         int param, int value )
+{
+    (void)chamctxt;
+    (void)request;
+    (void)param;
+    (void)value;
+    return CHAMELEON_SUCCESS;
+}
\ No newline at end of file
diff --git a/runtime/quark/control/runtime_control.c b/runtime/quark/control/runtime_control.c
index cfc447329696b02e127715609138f1e655663d48..c8ab8458544734075bbc566770e2dc4a299f46f1 100644
--- a/runtime/quark/control/runtime_control.c
+++ b/runtime/quark/control/runtime_control.c
@@ -29,7 +29,7 @@ int RUNTIME_init( CHAM_context_t *chamctxt,
                   int ncudas,
                   int nthreads_per_worker )
 {
-    int hres = 0;
+    int hres = -1;
     if ( ncudas > 0 ) {
         chameleon_warning( "RUNTIME_init_scheduler(quark)", "GPUs are not supported for now");
     }
@@ -40,6 +40,12 @@ int RUNTIME_init( CHAM_context_t *chamctxt,
 
     chamctxt->schedopt = (void*)QUARK_New( ncpus );
 
+    if(NULL != chamctxt->schedopt) {
+        chamctxt->nworkers = ncpus;
+        chamctxt->nthreads_per_worker = nthreads_per_worker;
+        hres = 0;
+    }
+
     return hres;
 }
 
diff --git a/runtime/starpu/codelets/codelet_dzasum.c b/runtime/starpu/codelets/codelet_dzasum.c
index 67df3e6ef5590c108b680344b63b5a62a956ec77..b88605ba14695571cee582d43bf67688bf8bc281 100644
--- a/runtime/starpu/codelets/codelet_dzasum.c
+++ b/runtime/starpu/codelets/codelet_dzasum.c
@@ -53,6 +53,8 @@ void INSERT_TASK_dzasum( const RUNTIME_option_t *options,
 {
     struct starpu_codelet *codelet = &cl_dzasum;
     void (*callback)(void*) = options->profiling ? cl_dzasum_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R(A, Am, An);
@@ -69,6 +71,7 @@ void INSERT_TASK_dzasum( const RUNTIME_option_t *options,
         STARPU_RW,        RTBLKADDR(B, double, Bm, Bn),
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
+         STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "dzasum",
 #endif
diff --git a/runtime/starpu/codelets/codelet_map.c b/runtime/starpu/codelets/codelet_map.c
index 347a76ed407fa55b54ee2d77deeb5e403d11be5f..65dd72e33fe2328e32e252d88d2d3a0468a6b735 100644
--- a/runtime/starpu/codelets/codelet_map.c
+++ b/runtime/starpu/codelets/codelet_map.c
@@ -48,6 +48,8 @@ void INSERT_TASK_map( const RUNTIME_option_t *options,
 
     struct starpu_codelet *codelet = &cl_map;
     void (*callback)(void*) = options->profiling ? cl_map_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_RW(A, Am, An);
@@ -64,6 +66,7 @@ void INSERT_TASK_map( const RUNTIME_option_t *options,
         STARPU_VALUE,    &op_args,                sizeof(void*),
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "map",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zaxpy.c b/runtime/starpu/codelets/codelet_zaxpy.c
index f19b201becb18d68cc457d5e909e33179403fcae..88cf08e022e8781a1dcaeb534d6347a55b973541 100644
--- a/runtime/starpu/codelets/codelet_zaxpy.c
+++ b/runtime/starpu/codelets/codelet_zaxpy.c
@@ -49,6 +49,8 @@ void INSERT_TASK_zaxpy( const RUNTIME_option_t *options,
 {
     struct starpu_codelet *codelet = &cl_zaxpy;
     void (*callback)(void*) = options->profiling ? cl_zaxpy_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R(A, Am, An);
@@ -65,6 +67,7 @@ void INSERT_TASK_zaxpy( const RUNTIME_option_t *options,
             STARPU_VALUE,    &incB,                        sizeof(int),
             STARPU_PRIORITY, options->priority,
             STARPU_CALLBACK, callback,
+            STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
             STARPU_NAME, "zaxpy",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zbuild.c b/runtime/starpu/codelets/codelet_zbuild.c
index a99d48944debd44cc894b01b7f6203b4097af8ad..ad52e6452e2064d80fc9858aa6c7db600af65b4d 100644
--- a/runtime/starpu/codelets/codelet_zbuild.c
+++ b/runtime/starpu/codelets/codelet_zbuild.c
@@ -61,6 +61,8 @@ CODELETS_CPU(zbuild, 1, cl_zbuild_cpu_func)
 
     struct starpu_codelet *codelet = &cl_zbuild;
     void (*callback)(void*) = options->profiling ? cl_zbuild_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
     int row_min, row_max, col_min, col_max;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
@@ -82,6 +84,7 @@ CODELETS_CPU(zbuild, 1, cl_zbuild_cpu_func)
         STARPU_VALUE,    &user_build_callback,          sizeof(void*),
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zbuild",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zgeadd.c b/runtime/starpu/codelets/codelet_zgeadd.c
index 495a7273f26ab42e68d786df318e304a04b1f50b..27ce15a01640fd9c19121788b35781a45bf25125 100644
--- a/runtime/starpu/codelets/codelet_zgeadd.c
+++ b/runtime/starpu/codelets/codelet_zgeadd.c
@@ -146,6 +146,8 @@ void INSERT_TASK_zgeadd( const RUNTIME_option_t *options,
 {
     struct starpu_codelet *codelet = &cl_zgeadd;
     void (*callback)(void*) = options->profiling ? cl_zgeadd_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R(A, Am, An);
@@ -163,6 +165,7 @@ void INSERT_TASK_zgeadd( const RUNTIME_option_t *options,
         STARPU_RW,        RTBLKADDR(B, CHAMELEON_Complex64_t, Bm, Bn),
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zgeadd",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zgelqt.c b/runtime/starpu/codelets/codelet_zgelqt.c
index d918f81101e65add5b898faf28ddbade6a244c30..63d7b9ca3cecc93332114b9fac3754fc1da599a3 100644
--- a/runtime/starpu/codelets/codelet_zgelqt.c
+++ b/runtime/starpu/codelets/codelet_zgelqt.c
@@ -66,6 +66,8 @@ void INSERT_TASK_zgelqt(const RUNTIME_option_t *options,
     (void)nb;
     struct starpu_codelet *codelet = &cl_zgelqt;
     void (*callback)(void*) = options->profiling ? cl_zgelqt_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
     CHAMELEON_starpu_ws_t *h_work = (CHAMELEON_starpu_ws_t*)(options->ws_host);
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
@@ -86,6 +88,7 @@ void INSERT_TASK_zgelqt(const RUNTIME_option_t *options,
         STARPU_VALUE,    &h_work,            sizeof(CHAMELEON_starpu_ws_t *),
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zgelqt",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zgemm.c b/runtime/starpu/codelets/codelet_zgemm.c
index 24b46d51476ee521fab40961c6d56b25a8d2e83b..034136bed27c4c6ffb264463a44800d3641af842 100644
--- a/runtime/starpu/codelets/codelet_zgemm.c
+++ b/runtime/starpu/codelets/codelet_zgemm.c
@@ -111,6 +111,8 @@ void INSERT_TASK_zgemm(const RUNTIME_option_t *options,
     (void)nb;
     struct starpu_codelet *codelet = &cl_zgemm;
     void (*callback)(void*) = options->profiling ? cl_zgemm_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R(A, Am, An);
@@ -132,6 +134,7 @@ void INSERT_TASK_zgemm(const RUNTIME_option_t *options,
         STARPU_RW,        RTBLKADDR(C, CHAMELEON_Complex64_t, Cm, Cn),
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zgemm",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zgeqrt.c b/runtime/starpu/codelets/codelet_zgeqrt.c
index 962f28c33520a2a741746d6de3e5c5dcc5230dfd..9f1f407d519485f26bb05fbd87b0a4c22f7fb6fb 100644
--- a/runtime/starpu/codelets/codelet_zgeqrt.c
+++ b/runtime/starpu/codelets/codelet_zgeqrt.c
@@ -67,6 +67,8 @@ void INSERT_TASK_zgeqrt(const RUNTIME_option_t *options,
     (void)nb;
     struct starpu_codelet *codelet = &cl_zgeqrt;
     void (*callback)(void*) = options->profiling ? cl_zgeqrt_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
     CHAMELEON_starpu_ws_t *h_work = (CHAMELEON_starpu_ws_t*)(options->ws_host);
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
@@ -87,6 +89,7 @@ void INSERT_TASK_zgeqrt(const RUNTIME_option_t *options,
         STARPU_VALUE,    &h_work,            sizeof(CHAMELEON_starpu_ws_t *),
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zgeqrt",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zgessm.c b/runtime/starpu/codelets/codelet_zgessm.c
index b93e04dd0f67ca013323175f61b56eec951cba41..310e7e2b9f01c0c09147212457c338a0be0035fd 100644
--- a/runtime/starpu/codelets/codelet_zgessm.c
+++ b/runtime/starpu/codelets/codelet_zgessm.c
@@ -62,6 +62,8 @@ void INSERT_TASK_zgessm( const RUNTIME_option_t *options,
     (void)nb;
     struct starpu_codelet *codelet = &cl_zgessm;
     void (*callback)(void*) = options->profiling ? cl_zgessm_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R(L, Lm, Ln);
@@ -81,6 +83,7 @@ void INSERT_TASK_zgessm( const RUNTIME_option_t *options,
         STARPU_RW,            RTBLKADDR(A, CHAMELEON_Complex64_t, Am, An),
         STARPU_PRIORITY,    options->priority,
         STARPU_CALLBACK,    callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zgessm",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zgessq.c b/runtime/starpu/codelets/codelet_zgessq.c
index 16ce389518206ca5bfe97ee27db0396435e953e1..f22e28a2416461272b6dc71ed88be065683efed1 100644
--- a/runtime/starpu/codelets/codelet_zgessq.c
+++ b/runtime/starpu/codelets/codelet_zgessq.c
@@ -52,6 +52,8 @@ void INSERT_TASK_zgessq( const RUNTIME_option_t *options,
 {
     struct starpu_codelet *codelet = &cl_zgessq;
     void (*callback)(void*) = options->profiling ? cl_zgessq_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R(A, Am, An);
@@ -67,6 +69,7 @@ void INSERT_TASK_zgessq( const RUNTIME_option_t *options,
         STARPU_RW,       RTBLKADDR(SCALESUMSQ, double, SCALESUMSQm, SCALESUMSQn),
         STARPU_PRIORITY, options->priority,
         STARPU_CALLBACK, callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zgessq",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zgetrf.c b/runtime/starpu/codelets/codelet_zgetrf.c
index 90482b6f67b076f775e9dc53762b7c5eed3eec94..23e40e8738d6bdb02742e16fa37474948f1843b4 100644
--- a/runtime/starpu/codelets/codelet_zgetrf.c
+++ b/runtime/starpu/codelets/codelet_zgetrf.c
@@ -63,6 +63,8 @@ void INSERT_TASK_zgetrf( const RUNTIME_option_t *options,
     (void)nb;
     struct starpu_codelet *codelet = &cl_zgetrf;
     void (*callback)(void*) = options->profiling ? cl_zgetrf_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_RW(A, Am, An);
@@ -80,6 +82,7 @@ void INSERT_TASK_zgetrf( const RUNTIME_option_t *options,
         STARPU_VALUE,    &(options->request),        sizeof(RUNTIME_request_t*),
         STARPU_PRIORITY,    options->priority,
         STARPU_CALLBACK,    callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zgetrf",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zgetrf_incpiv.c b/runtime/starpu/codelets/codelet_zgetrf_incpiv.c
index 720d94a3781197338951bd6eaab428adf11b4abb..4b2b788ba8ce1edb2aab076ea180bc38de3a1730 100644
--- a/runtime/starpu/codelets/codelet_zgetrf_incpiv.c
+++ b/runtime/starpu/codelets/codelet_zgetrf_incpiv.c
@@ -68,6 +68,8 @@ void INSERT_TASK_zgetrf_incpiv(const RUNTIME_option_t *options,
     (void)nb;
     struct starpu_codelet *codelet = &cl_zgetrf_incpiv;
     void (*callback)(void*) = options->profiling ? cl_zgetrf_incpiv_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_starpu_ws_t *h_work = (CHAMELEON_starpu_ws_t*)(options->ws_host);
 
@@ -92,6 +94,7 @@ void INSERT_TASK_zgetrf_incpiv(const RUNTIME_option_t *options,
         STARPU_VALUE,    &(options->request),        sizeof(RUNTIME_request_t*),
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zgetrf_incpiv",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zgetrf_nopiv.c b/runtime/starpu/codelets/codelet_zgetrf_nopiv.c
index c32ebc253f1fec34fb08f655acb40201b090c9d9..776415a755c28c0bf360439df68be75885edbea8 100644
--- a/runtime/starpu/codelets/codelet_zgetrf_nopiv.c
+++ b/runtime/starpu/codelets/codelet_zgetrf_nopiv.c
@@ -63,6 +63,8 @@ void INSERT_TASK_zgetrf_nopiv(const RUNTIME_option_t *options,
     (void)nb;
     struct starpu_codelet *codelet = &cl_zgetrf_nopiv;
     void (*callback)(void*) = options->profiling ? cl_zgetrf_nopiv_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_RW(A, Am, An);
@@ -79,6 +81,7 @@ void INSERT_TASK_zgetrf_nopiv(const RUNTIME_option_t *options,
         STARPU_VALUE,    &(options->request),        sizeof(RUNTIME_request_t*),
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zgetrf_nopiv",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zgram.c b/runtime/starpu/codelets/codelet_zgram.c
index a1c83f4760014e766f01fec47894d3ab0658455d..83643fc4f9839c8dc091e4ad6fd4c53426f3e1b0 100644
--- a/runtime/starpu/codelets/codelet_zgram.c
+++ b/runtime/starpu/codelets/codelet_zgram.c
@@ -55,6 +55,8 @@ void INSERT_TASK_zgram( const RUNTIME_option_t *options,
 {
   struct starpu_codelet *codelet = &cl_zgram;
   void (*callback)(void*) = options->profiling ? cl_zgram_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
   CHAMELEON_BEGIN_ACCESS_DECLARATION;
   CHAMELEON_ACCESS_R(Di, Dim, Din);
@@ -76,6 +78,7 @@ void INSERT_TASK_zgram( const RUNTIME_option_t *options,
         STARPU_RW,       RTBLKADDR(A, double, Am, An),
         STARPU_PRIORITY, options->priority,
         STARPU_CALLBACK, callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zgram",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zhe2ge.c b/runtime/starpu/codelets/codelet_zhe2ge.c
index 6f01c76135c99980288ed4b813e43419a43fe258..c7a24022b444d7f50fb8b91b74001ee6440899f0 100644
--- a/runtime/starpu/codelets/codelet_zhe2ge.c
+++ b/runtime/starpu/codelets/codelet_zhe2ge.c
@@ -58,6 +58,8 @@ void INSERT_TASK_zhe2ge(const RUNTIME_option_t *options,
     (void)mb;
     struct starpu_codelet *codelet = &cl_zhe2ge;
     void (*callback)(void*) = options->profiling ? cl_zhe2ge_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R(A, Am, An);
@@ -73,6 +75,7 @@ void INSERT_TASK_zhe2ge(const RUNTIME_option_t *options,
         STARPU_W,             RTBLKADDR(B, CHAMELEON_Complex64_t, Bm, Bn),
         STARPU_PRIORITY,    options->priority,
         STARPU_CALLBACK,    callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zhe2ge",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zhemm.c b/runtime/starpu/codelets/codelet_zhemm.c
index 31a2b87bf463aff8a59e7af109454b499163f919..b6a827896636970bfe338cbeacaae776b3dbc401 100644
--- a/runtime/starpu/codelets/codelet_zhemm.c
+++ b/runtime/starpu/codelets/codelet_zhemm.c
@@ -110,6 +110,8 @@ void INSERT_TASK_zhemm(const RUNTIME_option_t *options,
     (void)nb;
     struct starpu_codelet *codelet = &cl_zhemm;
     void (*callback)(void*) = options->profiling ? cl_zhemm_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R(A, Am, An);
@@ -130,6 +132,7 @@ void INSERT_TASK_zhemm(const RUNTIME_option_t *options,
         STARPU_RW,               RTBLKADDR(C, CHAMELEON_Complex64_t, Cm, Cn),
         STARPU_PRIORITY,    options->priority,
         STARPU_CALLBACK,    callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zhemm",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zher2k.c b/runtime/starpu/codelets/codelet_zher2k.c
index de32d9521b32249757f277a1ad9964fcc806cb61..291fef2794b146994577fc2ec83ff2704397a826 100644
--- a/runtime/starpu/codelets/codelet_zher2k.c
+++ b/runtime/starpu/codelets/codelet_zher2k.c
@@ -107,6 +107,8 @@ INSERT_TASK_zher2k( const RUNTIME_option_t *options,
     (void)nb;
     struct starpu_codelet *codelet = &cl_zher2k;
     void (*callback)(void*) = options->profiling ? cl_zher2k_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R(A, Am, An);
@@ -127,6 +129,7 @@ INSERT_TASK_zher2k( const RUNTIME_option_t *options,
         STARPU_RW,                 RTBLKADDR(C, CHAMELEON_Complex64_t, Cm, Cn),
         STARPU_PRIORITY,    options->priority,
         STARPU_CALLBACK,    callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zher2k",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zherfb.c b/runtime/starpu/codelets/codelet_zherfb.c
index e47bfa3ccf0c6afe92c3757bb7aa8603ce2345c4..e967fdfd1051a69c6796c03515c3c6f1a4102c39 100644
--- a/runtime/starpu/codelets/codelet_zherfb.c
+++ b/runtime/starpu/codelets/codelet_zherfb.c
@@ -94,6 +94,8 @@ void INSERT_TASK_zherfb(const RUNTIME_option_t *options,
 {
     struct starpu_codelet *codelet = &cl_zherfb;
     void (*callback)(void*) = options->profiling ? cl_zherfb_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R(A, Am, An);
@@ -115,6 +117,7 @@ void INSERT_TASK_zherfb(const RUNTIME_option_t *options,
         STARPU_SCRATCH,   options->ws_worker,
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zherfb",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zherk.c b/runtime/starpu/codelets/codelet_zherk.c
index d90885b263771bba7be8552179573539a192bf6d..6a8b17cd68d47fad48596896f05c00daf37bd049 100644
--- a/runtime/starpu/codelets/codelet_zherk.c
+++ b/runtime/starpu/codelets/codelet_zherk.c
@@ -102,6 +102,8 @@ void INSERT_TASK_zherk(const RUNTIME_option_t *options,
     (void)nb;
     struct starpu_codelet *codelet = &cl_zherk;
     void (*callback)(void*) = options->profiling ? cl_zherk_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R(A, Am, An);
@@ -120,6 +122,7 @@ void INSERT_TASK_zherk(const RUNTIME_option_t *options,
         STARPU_RW,        RTBLKADDR(C, CHAMELEON_Complex64_t, Cm, Cn),
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zherk",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zlacpy.c b/runtime/starpu/codelets/codelet_zlacpy.c
index 144a38c569a133218d4456e21b98b26820cd133a..5703507ed9baba655125f1168df80485cbd7202d 100644
--- a/runtime/starpu/codelets/codelet_zlacpy.c
+++ b/runtime/starpu/codelets/codelet_zlacpy.c
@@ -67,6 +67,8 @@ void INSERT_TASK_zlacpyx( const RUNTIME_option_t *options,
     (void)nb;
     struct starpu_codelet *codelet = &cl_zlacpy;
     void (*callback)(void*) = options->profiling ? cl_zlacpy_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R( A, Am, An );
@@ -84,6 +86,7 @@ void INSERT_TASK_zlacpyx( const RUNTIME_option_t *options,
         STARPU_W,        RTBLKADDR(B, CHAMELEON_Complex64_t, Bm, Bn),
         STARPU_PRIORITY, options->priority,
         STARPU_CALLBACK, callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zlacpy",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zlag2c.c b/runtime/starpu/codelets/codelet_zlag2c.c
index 622aa424da093d06397f62cf2b8323330cff8189..c3f44bc2a78d4b3916ece9f7f2e99a54f69ef4bb 100644
--- a/runtime/starpu/codelets/codelet_zlag2c.c
+++ b/runtime/starpu/codelets/codelet_zlag2c.c
@@ -60,6 +60,8 @@ void INSERT_TASK_zlag2c(const RUNTIME_option_t *options,
     (void)nb;
     struct starpu_codelet *codelet = &cl_zlag2c;
     void (*callback)(void*) = options->profiling ? cl_zlag2c_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R(A, Am, An);
@@ -74,6 +76,7 @@ void INSERT_TASK_zlag2c(const RUNTIME_option_t *options,
         STARPU_W,         RTBLKADDR(B, CHAMELEON_Complex32_t, Bm, Bn),
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zlag2c",
 #endif
@@ -110,6 +113,8 @@ void INSERT_TASK_clag2z(const RUNTIME_option_t *options,
     (void)nb;
     struct starpu_codelet *codelet = &cl_clag2z;
     void (*callback)(void*) = options->profiling ? cl_clag2z_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R( A, Am, An );
@@ -124,6 +129,7 @@ void INSERT_TASK_clag2z(const RUNTIME_option_t *options,
         STARPU_W,         RTBLKADDR(B, CHAMELEON_Complex64_t, Bm, Bn),
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "clag2z",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zlange.c b/runtime/starpu/codelets/codelet_zlange.c
index aa11096179edc17e526f1ccafd324e4cd186b763..23ca2f7cc02283e521edf3c6995b9e5ee00cab55 100644
--- a/runtime/starpu/codelets/codelet_zlange.c
+++ b/runtime/starpu/codelets/codelet_zlange.c
@@ -57,6 +57,8 @@ void INSERT_TASK_zlange( const RUNTIME_option_t *options,
     (void)NB;
     struct starpu_codelet *codelet = &cl_zlange;
     void (*callback)(void*) = options->profiling ? cl_zlange_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R(A, Am, An);
@@ -73,6 +75,7 @@ void INSERT_TASK_zlange( const RUNTIME_option_t *options,
         STARPU_W,        RTBLKADDR(B, double, Bm, Bn),
         STARPU_PRIORITY, options->priority,
         STARPU_CALLBACK, callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zlange",
 #endif
@@ -110,6 +113,8 @@ void INSERT_TASK_zlange_max(const RUNTIME_option_t *options,
 {
     struct starpu_codelet *codelet = &cl_zlange_max;
     void (*callback)(void*) = options->profiling ? cl_zlange_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R(  A, Am, An );
@@ -122,6 +127,7 @@ void INSERT_TASK_zlange_max(const RUNTIME_option_t *options,
         STARPU_RW,       RTBLKADDR(B, double, Bm, Bn),
         STARPU_PRIORITY, options->priority,
         STARPU_CALLBACK, callback,
+         STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zlange_max",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zlanhe.c b/runtime/starpu/codelets/codelet_zlanhe.c
index c5bcc1496bfe723153fece7b66763e42718d8caf..f31fea4c4c82b3dff4cfc5c47f8d6713f2bd2da4 100644
--- a/runtime/starpu/codelets/codelet_zlanhe.c
+++ b/runtime/starpu/codelets/codelet_zlanhe.c
@@ -56,6 +56,8 @@ void INSERT_TASK_zlanhe(const RUNTIME_option_t *options,
 {
     struct starpu_codelet *codelet = &cl_zlanhe;
     void (*callback)(void*) = options->profiling ? cl_zlange_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R(A, Am, An);
@@ -72,6 +74,7 @@ void INSERT_TASK_zlanhe(const RUNTIME_option_t *options,
         STARPU_W,        RTBLKADDR(B, double, Bm, Bn),
         STARPU_PRIORITY, options->priority,
         STARPU_CALLBACK, callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zlanhe",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zlansy.c b/runtime/starpu/codelets/codelet_zlansy.c
index e378fdc5f62ac557bd337195a451b00fcfa4c2e3..0fb7e31ef66ea97877ad65d6d5ffa9fc93deb421 100644
--- a/runtime/starpu/codelets/codelet_zlansy.c
+++ b/runtime/starpu/codelets/codelet_zlansy.c
@@ -57,6 +57,8 @@ void INSERT_TASK_zlansy( const RUNTIME_option_t *options,
     (void)NB;
     struct starpu_codelet *codelet = &cl_zlansy;
     void (*callback)(void*) = options->profiling ? cl_zlange_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R(A, Am, An);
@@ -73,6 +75,7 @@ void INSERT_TASK_zlansy( const RUNTIME_option_t *options,
         STARPU_W,        RTBLKADDR(B, double, Bm, Bn),
         STARPU_PRIORITY, options->priority,
         STARPU_CALLBACK, callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zlansy",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zlantr.c b/runtime/starpu/codelets/codelet_zlantr.c
index 8598eb4b637977d209b4aa5436fdbd36ef518eda..f13dd13bbe951e4474e41287fadc642af4b889c3 100644
--- a/runtime/starpu/codelets/codelet_zlantr.c
+++ b/runtime/starpu/codelets/codelet_zlantr.c
@@ -53,6 +53,8 @@ void INSERT_TASK_zlantr( const RUNTIME_option_t *options,
 {
     struct starpu_codelet *codelet = &cl_zlantr;
     void (*callback)(void*) = options->profiling ? cl_zlange_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R(A, Am, An);
@@ -71,6 +73,7 @@ void INSERT_TASK_zlantr( const RUNTIME_option_t *options,
         STARPU_W,        RTBLKADDR(B, double, Bm, Bn),
         STARPU_PRIORITY, options->priority,
         STARPU_CALLBACK, callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zlantr",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zlascal.c b/runtime/starpu/codelets/codelet_zlascal.c
index dbf072de129885d7cc5fe4543d2bcfd1651321e1..0916e8aa5e73887ad67cda9db946c1a81ecbbc24 100644
--- a/runtime/starpu/codelets/codelet_zlascal.c
+++ b/runtime/starpu/codelets/codelet_zlascal.c
@@ -54,6 +54,8 @@ void INSERT_TASK_zlascal(const RUNTIME_option_t *options,
     (void)nb;
     struct starpu_codelet *codelet = &cl_zlascal;
     void (*callback)(void*) = options->profiling ? cl_zlascal_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_RW(A, Am, An);
@@ -68,6 +70,7 @@ void INSERT_TASK_zlascal(const RUNTIME_option_t *options,
         STARPU_RW,         RTBLKADDR(A, CHAMELEON_Complex64_t, Am, An),
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zlascal",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zlaset.c b/runtime/starpu/codelets/codelet_zlaset.c
index 71daf564b3231ddf242e5d3a00c26e2c34a011f8..df278acd98ab3af5b8d13c9bd16c8573c0cdad68 100644
--- a/runtime/starpu/codelets/codelet_zlaset.c
+++ b/runtime/starpu/codelets/codelet_zlaset.c
@@ -56,6 +56,8 @@ void INSERT_TASK_zlaset(const RUNTIME_option_t *options,
 
     struct starpu_codelet *codelet = &cl_zlaset;
     void (*callback)(void*) = options->profiling ? cl_zlaset_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_W(A, Am, An);
@@ -71,6 +73,7 @@ void INSERT_TASK_zlaset(const RUNTIME_option_t *options,
         STARPU_W,      RTBLKADDR(A, CHAMELEON_Complex64_t, Am, An),
         STARPU_PRIORITY,    options->priority,
         STARPU_CALLBACK,    callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zlaset",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zlaset2.c b/runtime/starpu/codelets/codelet_zlaset2.c
index e6fb285583f859813541101dc771f573314fd0e2..61256da734846416a495753fc65fbffc92fab8d3 100644
--- a/runtime/starpu/codelets/codelet_zlaset2.c
+++ b/runtime/starpu/codelets/codelet_zlaset2.c
@@ -53,6 +53,8 @@ void INSERT_TASK_zlaset2(const RUNTIME_option_t *options,
 
     struct starpu_codelet *codelet = &cl_zlaset2;
     void (*callback)(void*) = options->profiling ? cl_zlaset2_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_W(A, Am, An);
@@ -67,6 +69,7 @@ void INSERT_TASK_zlaset2(const RUNTIME_option_t *options,
         STARPU_W,      RTBLKADDR(A, CHAMELEON_Complex64_t, Am, An),
         STARPU_PRIORITY,    options->priority,
         STARPU_CALLBACK,    callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zlaset2",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zlatro.c b/runtime/starpu/codelets/codelet_zlatro.c
index 86696064f30ebf0acfc3f41608529fe06be38238..20ed9394cc2b0beca557a9535e359ff2836f6437 100644
--- a/runtime/starpu/codelets/codelet_zlatro.c
+++ b/runtime/starpu/codelets/codelet_zlatro.c
@@ -63,6 +63,8 @@ void INSERT_TASK_zlatro( const RUNTIME_option_t *options,
 {
     struct starpu_codelet *codelet = &cl_zlatro;
     void (*callback)(void*) = NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R(A, Am, An);
@@ -79,6 +81,7 @@ void INSERT_TASK_zlatro( const RUNTIME_option_t *options,
         STARPU_W,        RTBLKADDR(B, CHAMELEON_Complex64_t, Bm, Bn),
         STARPU_PRIORITY, options->priority,
         STARPU_CALLBACK, callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zlatro",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zlauum.c b/runtime/starpu/codelets/codelet_zlauum.c
index 4c7911c29365ab83e3b327ffbdd13c0a250ae269..59d67ebf5d984c0baf12f4a1b977441ff6858cd8 100644
--- a/runtime/starpu/codelets/codelet_zlauum.c
+++ b/runtime/starpu/codelets/codelet_zlauum.c
@@ -58,6 +58,8 @@ void INSERT_TASK_zlauum( const RUNTIME_option_t *options,
     (void)nb;
     struct starpu_codelet *codelet = &cl_zlauum;
     void (*callback)(void*) = options->profiling ? cl_zlauum_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_RW(A, Am, An);
@@ -70,6 +72,7 @@ void INSERT_TASK_zlauum( const RUNTIME_option_t *options,
         STARPU_RW,        RTBLKADDR(A, CHAMELEON_Complex64_t, Am, An),
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zlauum",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zplghe.c b/runtime/starpu/codelets/codelet_zplghe.c
index 5b75d66158d98a4f8d91a554e8b2129dabab75b8..361ebc17e91e164a7e6666522451883da86dafc2 100644
--- a/runtime/starpu/codelets/codelet_zplghe.c
+++ b/runtime/starpu/codelets/codelet_zplghe.c
@@ -59,6 +59,8 @@ void INSERT_TASK_zplghe( const RUNTIME_option_t *options,
 {
     struct starpu_codelet *codelet = &cl_zplghe;
     void (*callback)(void*) = options->profiling ? cl_zplghe_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_W(A, Am, An);
@@ -76,6 +78,7 @@ void INSERT_TASK_zplghe( const RUNTIME_option_t *options,
         STARPU_VALUE, &seed,   sizeof(unsigned long long int),
         STARPU_PRIORITY,    options->priority,
         STARPU_CALLBACK,    callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zplghe",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zplgsy.c b/runtime/starpu/codelets/codelet_zplgsy.c
index 5b79c6839b7b65a192c4ebb872222ebea9b17802..efc64b037946ed5bd5848342c8e373cd4aa66b5c 100644
--- a/runtime/starpu/codelets/codelet_zplgsy.c
+++ b/runtime/starpu/codelets/codelet_zplgsy.c
@@ -60,6 +60,8 @@ void INSERT_TASK_zplgsy( const RUNTIME_option_t *options,
 
     struct starpu_codelet *codelet = &cl_zplgsy;
     void (*callback)(void*) = options->profiling ? cl_zplgsy_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_W(A, Am, An);
@@ -77,6 +79,7 @@ void INSERT_TASK_zplgsy( const RUNTIME_option_t *options,
         STARPU_VALUE, &seed,   sizeof(unsigned long long int),
         STARPU_PRIORITY,    options->priority,
         STARPU_CALLBACK,    callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zplgsy",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zplrnt.c b/runtime/starpu/codelets/codelet_zplrnt.c
index 3f429707864031f46890a72034ed5d9cec0bbf28..0d86aeff00b89bbdda7a5d137eeff1b65b7b3926 100644
--- a/runtime/starpu/codelets/codelet_zplrnt.c
+++ b/runtime/starpu/codelets/codelet_zplrnt.c
@@ -57,6 +57,8 @@ void INSERT_TASK_zplrnt( const RUNTIME_option_t *options,
 
     struct starpu_codelet *codelet = &cl_zplrnt;
     void (*callback)(void*) = options->profiling ? cl_zplrnt_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_W(A, Am, An);
@@ -73,6 +75,7 @@ void INSERT_TASK_zplrnt( const RUNTIME_option_t *options,
         STARPU_VALUE, &seed,   sizeof(unsigned long long int),
         STARPU_PRIORITY,    options->priority,
         STARPU_CALLBACK,    callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zplrnt",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zplssq.c b/runtime/starpu/codelets/codelet_zplssq.c
index 65deb638fb29a130eb78a19300123a3b25432fa2..b29f1d74e8230e45876d2b960508a955a1ff59c7 100644
--- a/runtime/starpu/codelets/codelet_zplssq.c
+++ b/runtime/starpu/codelets/codelet_zplssq.c
@@ -57,6 +57,8 @@ void INSERT_TASK_zplssq( const RUNTIME_option_t *options,
 {
     struct starpu_codelet *codelet = &cl_zplssq;
     void (*callback)(void*) = options->profiling ? cl_zplssq_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R(  IN,  INm,  INn  );
@@ -72,6 +74,7 @@ void INSERT_TASK_zplssq( const RUNTIME_option_t *options,
         STARPU_RW, RTBLKADDR( OUT, double, OUTm, OUTn ),
         STARPU_PRIORITY,    options->priority,
         STARPU_CALLBACK,    callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zplssq",
 #endif
@@ -105,6 +108,8 @@ void INSERT_TASK_zplssq2( const RUNTIME_option_t *options, int N,
 {
     struct starpu_codelet *codelet = &cl_zplssq2;
     void (*callback)(void*) = options->profiling ? cl_zplssq2_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_RW( RESULT, RESULTm, RESULTn );
diff --git a/runtime/starpu/codelets/codelet_zpotrf.c b/runtime/starpu/codelets/codelet_zpotrf.c
index b8b189375ef13ad3e96aeb34f26ea1cb38c3479f..de6c1886b7e349411d89a34be3089b9e1264a902 100644
--- a/runtime/starpu/codelets/codelet_zpotrf.c
+++ b/runtime/starpu/codelets/codelet_zpotrf.c
@@ -67,6 +67,8 @@ void INSERT_TASK_zpotrf(const RUNTIME_option_t *options,
     (void)nb;
     struct starpu_codelet *codelet = &cl_zpotrf;
     void (*callback)(void*) = options->profiling ? cl_zpotrf_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_RW(A, Am, An);
@@ -83,6 +85,7 @@ void INSERT_TASK_zpotrf(const RUNTIME_option_t *options,
         /* STARPU_SCRATCH,   options->ws_worker, */
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zpotrf",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zssssm.c b/runtime/starpu/codelets/codelet_zssssm.c
index 7a3caf86bb9fec7454586c6aad9e86358615b6a7..29ef312bd6207d7d3c2476e5a764bcacf6a3f975 100644
--- a/runtime/starpu/codelets/codelet_zssssm.c
+++ b/runtime/starpu/codelets/codelet_zssssm.c
@@ -67,6 +67,8 @@ void INSERT_TASK_zssssm( const RUNTIME_option_t *options,
     (void)nb;
     struct starpu_codelet *codelet = &cl_zssssm;
     void (*callback)(void*) = options->profiling ? cl_zssssm_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_RW(A1, A1m, A1n);
@@ -90,6 +92,7 @@ void INSERT_TASK_zssssm( const RUNTIME_option_t *options,
         STARPU_VALUE,          &IPIV,                      sizeof(int*),
         STARPU_PRIORITY,    options->priority,
         STARPU_CALLBACK,    callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zssssm",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zsymm.c b/runtime/starpu/codelets/codelet_zsymm.c
index de2aeb22e73cbf60d64ea699af86b3996d069656..689be9b62368127011176dca3a6507a429f37913 100644
--- a/runtime/starpu/codelets/codelet_zsymm.c
+++ b/runtime/starpu/codelets/codelet_zsymm.c
@@ -110,6 +110,8 @@ void INSERT_TASK_zsymm(const RUNTIME_option_t *options,
     (void)nb;
     struct starpu_codelet *codelet = &cl_zsymm;
     void (*callback)(void*) = options->profiling ? cl_zsymm_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R(A, Am, An);
@@ -130,6 +132,7 @@ void INSERT_TASK_zsymm(const RUNTIME_option_t *options,
         STARPU_RW,               RTBLKADDR(C, CHAMELEON_Complex64_t, Cm, Cn),
         STARPU_PRIORITY,    options->priority,
         STARPU_CALLBACK,    callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zsymm",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zsyr2k.c b/runtime/starpu/codelets/codelet_zsyr2k.c
index 1da32daad22746d712c30525828e0d5133c9c8bb..86037a3778b6511a54d7b2e2f023856cd9ee5f7a 100644
--- a/runtime/starpu/codelets/codelet_zsyr2k.c
+++ b/runtime/starpu/codelets/codelet_zsyr2k.c
@@ -106,6 +106,8 @@ void INSERT_TASK_zsyr2k(const RUNTIME_option_t *options,
     (void)nb;
     struct starpu_codelet *codelet = &cl_zsyr2k;
     void (*callback)(void*) = options->profiling ? cl_zsyr2k_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R(A, Am, An);
@@ -126,6 +128,7 @@ void INSERT_TASK_zsyr2k(const RUNTIME_option_t *options,
         STARPU_RW,                 RTBLKADDR(C, CHAMELEON_Complex64_t, Cm, Cn),
         STARPU_PRIORITY,    options->priority,
         STARPU_CALLBACK,    callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zsyr2k",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zsyrk.c b/runtime/starpu/codelets/codelet_zsyrk.c
index d340e7a7d17a5e703203ba4933839fb411af72ec..66782975f6bdf5a409f431117e2096028a3cf870 100644
--- a/runtime/starpu/codelets/codelet_zsyrk.c
+++ b/runtime/starpu/codelets/codelet_zsyrk.c
@@ -102,6 +102,8 @@ void INSERT_TASK_zsyrk(const RUNTIME_option_t *options,
     (void)nb;
     struct starpu_codelet *codelet = &cl_zsyrk;
     void (*callback)(void*) = options->profiling ? cl_zsyrk_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R(A, Am, An);
@@ -120,6 +122,7 @@ void INSERT_TASK_zsyrk(const RUNTIME_option_t *options,
         STARPU_RW,                 RTBLKADDR(C, CHAMELEON_Complex64_t, Cm, Cn),
         STARPU_PRIORITY,    options->priority,
         STARPU_CALLBACK,    callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zsyrk",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zsyssq.c b/runtime/starpu/codelets/codelet_zsyssq.c
index 29283f0b55ebc77dc01d52a30334a3c39e77f220..951e60d1b6b10779ff3737f8915831232ee7f280 100644
--- a/runtime/starpu/codelets/codelet_zsyssq.c
+++ b/runtime/starpu/codelets/codelet_zsyssq.c
@@ -50,6 +50,8 @@ void INSERT_TASK_zsyssq( const RUNTIME_option_t *options,
 {
     struct starpu_codelet *codelet = &cl_zsyssq;
     void (*callback)(void*) = options->profiling ? cl_zgessq_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R(A, Am, An);
@@ -65,6 +67,7 @@ void INSERT_TASK_zsyssq( const RUNTIME_option_t *options,
         STARPU_RW,       RTBLKADDR(SCALESUMSQ, double, SCALESUMSQm, SCALESUMSQn),
         STARPU_PRIORITY, options->priority,
         STARPU_CALLBACK, callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zsyssq",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zsytrf_nopiv.c b/runtime/starpu/codelets/codelet_zsytrf_nopiv.c
index 3293f977acb7870640adedd490d18103b678efb2..cbac3596ee2cab76abc4ed7c49b1bbff6f6f1527 100644
--- a/runtime/starpu/codelets/codelet_zsytrf_nopiv.c
+++ b/runtime/starpu/codelets/codelet_zsytrf_nopiv.c
@@ -54,6 +54,8 @@ void INSERT_TASK_zsytrf_nopiv( const RUNTIME_option_t *options,
     (void)nb;
     struct starpu_codelet *codelet = &cl_zsytrf_nopiv;
     void (*callback)(void*) = options->profiling ? cl_zsytrf_nopiv_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_RW(A, Am, An);
@@ -68,6 +70,7 @@ void INSERT_TASK_zsytrf_nopiv( const RUNTIME_option_t *options,
         /* STARPU_SCRATCH,   options->ws_worker, */
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zsytrf_nopiv",
 #endif
diff --git a/runtime/starpu/codelets/codelet_ztplqt.c b/runtime/starpu/codelets/codelet_ztplqt.c
index 96f966b8a6b60186432c5bff1c7637c990b4760a..0754c207f01e2fa3463e309991f451f3b3be3510 100644
--- a/runtime/starpu/codelets/codelet_ztplqt.c
+++ b/runtime/starpu/codelets/codelet_ztplqt.c
@@ -58,6 +58,8 @@ void INSERT_TASK_ztplqt( const RUNTIME_option_t *options,
 {
     struct starpu_codelet *codelet = &cl_ztplqt;
     void (*callback)(void*) = options->profiling ? cl_ztplqt_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_RW(A, Am, An);
@@ -78,6 +80,7 @@ void INSERT_TASK_ztplqt( const RUNTIME_option_t *options,
         STARPU_SCRATCH,   options->ws_worker,
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_USE_MPI)
         STARPU_EXECUTE_ON_NODE, B->get_rankof(B, Bm, Bn),
 #endif
diff --git a/runtime/starpu/codelets/codelet_ztpmlqt.c b/runtime/starpu/codelets/codelet_ztpmlqt.c
index c62d453cc675363292efa386219a627b88fb8723..92d9e3bac6644997c5fddf9f6e281cf8a5e721b1 100644
--- a/runtime/starpu/codelets/codelet_ztpmlqt.c
+++ b/runtime/starpu/codelets/codelet_ztpmlqt.c
@@ -104,6 +104,8 @@ void INSERT_TASK_ztpmlqt( const RUNTIME_option_t *options,
 {
     struct starpu_codelet *codelet = &cl_ztpmlqt;
     void (*callback)(void*) = options->profiling ? cl_ztpmlqt_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R(V, Vm, Vn);
@@ -130,6 +132,7 @@ void INSERT_TASK_ztpmlqt( const RUNTIME_option_t *options,
         STARPU_SCRATCH,   options->ws_worker,
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_USE_MPI)
         STARPU_EXECUTE_ON_NODE, B->get_rankof(B, Bm, Bn),
 #endif
diff --git a/runtime/starpu/codelets/codelet_ztpmqrt.c b/runtime/starpu/codelets/codelet_ztpmqrt.c
index 13fbfef6636e678743b7046a3ae651a2960f77e2..c0da2c794afedca487488388d42bd47204b22f3a 100644
--- a/runtime/starpu/codelets/codelet_ztpmqrt.c
+++ b/runtime/starpu/codelets/codelet_ztpmqrt.c
@@ -104,6 +104,8 @@ void INSERT_TASK_ztpmqrt( const RUNTIME_option_t *options,
 {
     struct starpu_codelet *codelet = &cl_ztpmqrt;
     void (*callback)(void*) = options->profiling ? cl_ztpmqrt_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R(V, Vm, Vn);
@@ -130,6 +132,7 @@ void INSERT_TASK_ztpmqrt( const RUNTIME_option_t *options,
         STARPU_SCRATCH,   options->ws_worker,
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_USE_MPI)
         STARPU_EXECUTE_ON_NODE, B->get_rankof(B, Bm, Bn),
 #endif
diff --git a/runtime/starpu/codelets/codelet_ztpqrt.c b/runtime/starpu/codelets/codelet_ztpqrt.c
index d6300f71ef49a9fe4a12ed23ec92a5045934f830..596bb44a28ee49045c69a512c0dff598cc0a7f30 100644
--- a/runtime/starpu/codelets/codelet_ztpqrt.c
+++ b/runtime/starpu/codelets/codelet_ztpqrt.c
@@ -57,6 +57,8 @@ void INSERT_TASK_ztpqrt( const RUNTIME_option_t *options,
 {
     struct starpu_codelet *codelet = &cl_ztpqrt;
     void (*callback)(void*) = options->profiling ? cl_ztpqrt_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_RW(A, Am, An);
@@ -77,6 +79,7 @@ void INSERT_TASK_ztpqrt( const RUNTIME_option_t *options,
         STARPU_SCRATCH,   options->ws_worker,
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_USE_MPI)
         STARPU_EXECUTE_ON_NODE, B->get_rankof(B, Bm, Bn),
 #endif
diff --git a/runtime/starpu/codelets/codelet_ztradd.c b/runtime/starpu/codelets/codelet_ztradd.c
index d23ce80ebf8e278f1e9b0244af475116c50138f0..e19dd2636fce5ea0d9ffb13345cc37953eadd9a5 100644
--- a/runtime/starpu/codelets/codelet_ztradd.c
+++ b/runtime/starpu/codelets/codelet_ztradd.c
@@ -114,6 +114,8 @@ void INSERT_TASK_ztradd( const RUNTIME_option_t *options,
 {
     struct starpu_codelet *codelet = &cl_ztradd;
     void (*callback)(void*) = options->profiling ? cl_zgeadd_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R(A, Am, An);
@@ -132,6 +134,7 @@ void INSERT_TASK_ztradd( const RUNTIME_option_t *options,
         STARPU_RW,        RTBLKADDR(B, CHAMELEON_Complex64_t, Bm, Bn),
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "ztradd",
 #endif
diff --git a/runtime/starpu/codelets/codelet_ztrasm.c b/runtime/starpu/codelets/codelet_ztrasm.c
index d650d197395ae267693e8f869c54bec55e2a773a..527c7e44b2511285229ea05e9b90039d6bd23655 100644
--- a/runtime/starpu/codelets/codelet_ztrasm.c
+++ b/runtime/starpu/codelets/codelet_ztrasm.c
@@ -53,6 +53,8 @@ void INSERT_TASK_ztrasm( const RUNTIME_option_t *options,
 {
     struct starpu_codelet *codelet = &cl_ztrasm;
     void (*callback)(void*) = options->profiling ? cl_ztrasm_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R(A, Am, An);
@@ -70,6 +72,7 @@ void INSERT_TASK_ztrasm( const RUNTIME_option_t *options,
         STARPU_RW,       RTBLKADDR(B, double, Bm, Bn),
         STARPU_PRIORITY, options->priority,
         STARPU_CALLBACK, callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "ztrasm",
 #endif
diff --git a/runtime/starpu/codelets/codelet_ztrmm.c b/runtime/starpu/codelets/codelet_ztrmm.c
index 92eb37b92890f5a69339ae8d443bf29e903e1ec8..a1d24cf9542f5ac1e310511aa440f293fb35ab56 100644
--- a/runtime/starpu/codelets/codelet_ztrmm.c
+++ b/runtime/starpu/codelets/codelet_ztrmm.c
@@ -105,6 +105,8 @@ void INSERT_TASK_ztrmm(const RUNTIME_option_t *options,
     (void)nb;
     struct starpu_codelet *codelet = &cl_ztrmm;
     void (*callback)(void*) = options->profiling ? cl_ztrmm_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R(A, Am, An);
@@ -124,6 +126,7 @@ void INSERT_TASK_ztrmm(const RUNTIME_option_t *options,
         STARPU_RW,                 RTBLKADDR(B, CHAMELEON_Complex64_t, Bm, Bn),
         STARPU_PRIORITY,    options->priority,
         STARPU_CALLBACK,    callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "ztrmm",
 #endif
diff --git a/runtime/starpu/codelets/codelet_ztrsm.c b/runtime/starpu/codelets/codelet_ztrsm.c
index 250f39fbbbbcdd5363c91e83dc1bf09ca3c97117..f4ab409209f9d82b333322ac88bf23ed2dfc060e 100644
--- a/runtime/starpu/codelets/codelet_ztrsm.c
+++ b/runtime/starpu/codelets/codelet_ztrsm.c
@@ -103,6 +103,8 @@ void INSERT_TASK_ztrsm(const RUNTIME_option_t *options,
     (void)nb;
     struct starpu_codelet *codelet = &cl_ztrsm;
     void (*callback)(void*) = options->profiling ? cl_ztrsm_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R(A, Am, An);
@@ -122,6 +124,7 @@ void INSERT_TASK_ztrsm(const RUNTIME_option_t *options,
         STARPU_RW,        RTBLKADDR(B, CHAMELEON_Complex64_t, Bm, Bn),
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "ztrsm",
 #endif
diff --git a/runtime/starpu/codelets/codelet_ztrssq.c b/runtime/starpu/codelets/codelet_ztrssq.c
index b92c02f70e37271869e96619bb25f342579f1ccf..d7ed201afc60538aebadeaa78294c38fc7f1c5c4 100644
--- a/runtime/starpu/codelets/codelet_ztrssq.c
+++ b/runtime/starpu/codelets/codelet_ztrssq.c
@@ -52,6 +52,8 @@ void INSERT_TASK_ztrssq( const RUNTIME_option_t *options,
 {
     struct starpu_codelet *codelet = &cl_ztrssq;
     void (*callback)(void*) = options->profiling ? cl_ztrasm_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R(A, Am, An);
@@ -68,6 +70,7 @@ void INSERT_TASK_ztrssq( const RUNTIME_option_t *options,
         STARPU_RW,       RTBLKADDR(SCALESUMSQ, double, SCALESUMSQm, SCALESUMSQn),
         STARPU_PRIORITY, options->priority,
         STARPU_CALLBACK, callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "ztrssq",
 #endif
diff --git a/runtime/starpu/codelets/codelet_ztrtri.c b/runtime/starpu/codelets/codelet_ztrtri.c
index 4c891806ce5070341a21f4cc8d8c71bed8e263b6..758542d8895ab175550bdf3bb266d6ac171b8661 100644
--- a/runtime/starpu/codelets/codelet_ztrtri.c
+++ b/runtime/starpu/codelets/codelet_ztrtri.c
@@ -68,6 +68,8 @@ void INSERT_TASK_ztrtri( const RUNTIME_option_t *options,
     (void)nb;
     struct starpu_codelet *codelet = &cl_ztrtri;
     void (*callback)(void*) = options->profiling ? cl_ztrtri_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_RW(A, Am, An);
@@ -84,6 +86,7 @@ void INSERT_TASK_ztrtri( const RUNTIME_option_t *options,
         STARPU_VALUE,    &(options->request),        sizeof(RUNTIME_request_t*),
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "ztrtri",
 #endif
diff --git a/runtime/starpu/codelets/codelet_ztsmlq_hetra1.c b/runtime/starpu/codelets/codelet_ztsmlq_hetra1.c
index d90d7742fd3f8b12a64260aea63b99def65a309c..01704f33ac1fa6d97849d97aa73a6416e2dc208c 100644
--- a/runtime/starpu/codelets/codelet_ztsmlq_hetra1.c
+++ b/runtime/starpu/codelets/codelet_ztsmlq_hetra1.c
@@ -73,6 +73,8 @@ void INSERT_TASK_ztsmlq_hetra1( const RUNTIME_option_t *options,
 {
     struct starpu_codelet *codelet = &cl_ztsmlq_hetra1;
     void (*callback)(void*) = options->profiling ? cl_ztsmlq_hetra1_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     int ldWORK = side == ChamLeft ? ib : nb;
 
@@ -101,6 +103,7 @@ void INSERT_TASK_ztsmlq_hetra1( const RUNTIME_option_t *options,
         STARPU_SCRATCH,   options->ws_worker,
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "ztsmlq_hetra1",
 #endif
diff --git a/runtime/starpu/codelets/codelet_ztsmqr_hetra1.c b/runtime/starpu/codelets/codelet_ztsmqr_hetra1.c
index 04adf4260521c5172818d7637a53bbbc1d133459..4c6b5229e72eb9083db9ac2df481b4cb64e68c9a 100644
--- a/runtime/starpu/codelets/codelet_ztsmqr_hetra1.c
+++ b/runtime/starpu/codelets/codelet_ztsmqr_hetra1.c
@@ -73,6 +73,8 @@ void INSERT_TASK_ztsmqr_hetra1( const RUNTIME_option_t *options,
 {
     struct starpu_codelet *codelet = &cl_ztsmqr_hetra1;
     void (*callback)(void*) = options->profiling ? cl_ztsmqr_hetra1_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     int ldWORK = side == ChamLeft ? ib : nb;
 
@@ -101,6 +103,7 @@ void INSERT_TASK_ztsmqr_hetra1( const RUNTIME_option_t *options,
         STARPU_SCRATCH,   options->ws_worker,
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "ztsmqr_hetra1",
 #endif
diff --git a/runtime/starpu/codelets/codelet_ztstrf.c b/runtime/starpu/codelets/codelet_ztstrf.c
index 1caab2a068db71654e4fc48e3af5cde4e24bc687..32b3fb5ad829a995f4db5a52c7c1fc7a8ceac4af 100644
--- a/runtime/starpu/codelets/codelet_ztstrf.c
+++ b/runtime/starpu/codelets/codelet_ztstrf.c
@@ -80,6 +80,8 @@ void INSERT_TASK_ztstrf( const RUNTIME_option_t *options,
     (void)nb;
     struct starpu_codelet *codelet = &cl_ztstrf;
     void (*callback)(void*) = options->profiling ? cl_ztstrf_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
     CHAMELEON_starpu_ws_t *d_work = (CHAMELEON_starpu_ws_t*)(options->ws_host);
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
@@ -107,6 +109,7 @@ void INSERT_TASK_ztstrf( const RUNTIME_option_t *options,
         STARPU_VALUE,    &(options->request),        sizeof(RUNTIME_request_t*),
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "ztstrf",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zunmlq.c b/runtime/starpu/codelets/codelet_zunmlq.c
index 7ae725bdd087d3c31ca049614b675fbb62d14823..7f2b6b24f37bc06680bf8ae50fe66c40720a06ba 100644
--- a/runtime/starpu/codelets/codelet_zunmlq.c
+++ b/runtime/starpu/codelets/codelet_zunmlq.c
@@ -106,6 +106,8 @@ void INSERT_TASK_zunmlq( const RUNTIME_option_t *options,
 {
     struct starpu_codelet *codelet = &cl_zunmlq;
     void (*callback)(void*) = options->profiling ? cl_zunmlq_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R(A, Am, An);
@@ -129,6 +131,7 @@ void INSERT_TASK_zunmlq( const RUNTIME_option_t *options,
         STARPU_VALUE,    &nb,                sizeof(int),
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zunmlq",
 #endif
diff --git a/runtime/starpu/codelets/codelet_zunmqr.c b/runtime/starpu/codelets/codelet_zunmqr.c
index 8ea66722b935b2ccd365ac219842b448687c4282..de61f52c9e5bdf04bba2c231a3cc407b0330b06a 100644
--- a/runtime/starpu/codelets/codelet_zunmqr.c
+++ b/runtime/starpu/codelets/codelet_zunmqr.c
@@ -105,6 +105,8 @@ void INSERT_TASK_zunmqr( const RUNTIME_option_t *options,
 {
     struct starpu_codelet *codelet = &cl_zunmqr;
     void (*callback)(void*) = options->profiling ? cl_zunmqr_callback : NULL;
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(options->request->schedopt);
+    int workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
     CHAMELEON_BEGIN_ACCESS_DECLARATION;
     CHAMELEON_ACCESS_R(A, Am, An);
@@ -128,6 +130,7 @@ void INSERT_TASK_zunmqr( const RUNTIME_option_t *options,
         STARPU_VALUE,    &nb,                sizeof(int),
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
+        STARPU_EXECUTE_ON_WORKER, workerid,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
         STARPU_NAME, "zunmqr",
 #endif
diff --git a/runtime/starpu/control/runtime_async.c b/runtime/starpu/control/runtime_async.c
index ef2dbcc8b102751253f640ed509ea0a5678cd719..3241acc15ca6e0c49d304b014ba2500286da5c05 100644
--- a/runtime/starpu/control/runtime_async.c
+++ b/runtime/starpu/control/runtime_async.c
@@ -76,3 +76,60 @@ void RUNTIME_sequence_flush( CHAM_context_t  *chamctxt,
     request->status = status;
     return;
 }
+
+/**
+ *  Create a request
+ */
+int RUNTIME_request_create( CHAM_context_t  *chamctxt,
+                            RUNTIME_request_t *request )
+{
+    (void)chamctxt;
+    /* allocate schedopt */
+    request->schedopt = (starpu_option_request_t*)malloc(sizeof(starpu_option_request_t));
+    /* initialize schedopt */
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(request->schedopt);
+    /* default is to not use "execute_on_a_specific_worker" i.e. -1 */
+    schedopt->workerid = -1;
+    request->status = CHAMELEON_SUCCESS;
+    return CHAMELEON_SUCCESS;
+}
+
+/**
+ *  Destroy a request
+ */
+int RUNTIME_request_destroy( CHAM_context_t  *chamctxt,
+                             RUNTIME_request_t *request )
+{
+    (void)chamctxt;
+    free(request->schedopt);
+    return CHAMELEON_SUCCESS;
+}
+
+/**
+ *  Set runtime parameter for a request
+ */
+int RUNTIME_request_set( CHAM_context_t  *chamctxt,
+                         RUNTIME_request_t *request,
+                         int param, int value )
+{
+    if ( request->schedopt == NULL ) {
+        chameleon_error("RUNTIME_request_set", "request not initialized");
+        return CHAMELEON_ERR_NOT_INITIALIZED;
+    }
+    starpu_option_request_t* schedopt = (starpu_option_request_t *)(request->schedopt);
+
+    switch ( param ) {
+        case CHAMELEON_REQUEST_WORKERID:
+            if ( (value < -1) || (value >= chamctxt->nworkers) ) {
+                chameleon_error("RUNTIME_request_set", "workerid should be in [-1, NCPUS-1]");
+                return CHAMELEON_ERR_ILLEGAL_VALUE;
+            }
+            schedopt->workerid = value;
+            break;
+        default:
+            chameleon_error("RUNTIME_request_set", "unknown parameter");
+            return CHAMELEON_ERR_ILLEGAL_VALUE;
+    }
+
+    return CHAMELEON_SUCCESS;
+}
\ No newline at end of file
diff --git a/runtime/starpu/control/runtime_control.c b/runtime/starpu/control/runtime_control.c
index 9e29f90f8f6aa95607aa1728aab3f4be38a0b518..69fe75a64ee01b5eb98f87bde1c214b9a7e00dde 100644
--- a/runtime/starpu/control/runtime_control.c
+++ b/runtime/starpu/control/runtime_control.c
@@ -107,6 +107,9 @@ int RUNTIME_init( CHAM_context_t *chamctxt,
         chamctxt->parallel_enabled = CHAMELEON_FALSE;
 
         hres = chameleon_starpu_init( conf );
+
+        chamctxt->nworkers = ncpus;
+        chamctxt->nthreads_per_worker = nthreads_per_worker;
     }
     else {
         int worker;
diff --git a/runtime/starpu/include/chameleon_starpu.h.in b/runtime/starpu/include/chameleon_starpu.h.in
index 5616664308237038adb68d3e9467433835032664..767c65f1342328dfa3bcd59071ce95bc22b1a166 100644
--- a/runtime/starpu/include/chameleon_starpu.h.in
+++ b/runtime/starpu/include/chameleon_starpu.h.in
@@ -77,6 +77,11 @@
 
 typedef struct starpu_conf starpu_conf_t;
 
+/* Structure used to give some options during one request (procedure) */
+typedef struct starpu_option_request_s {
+    int workerid; // to force task execution on a specific workerid
+} starpu_option_request_t;
+
 /**/
 
 /*