diff --git a/control/descriptor.h b/control/descriptor.h
index e0ebcc936077256f42902dd8a49dcf05ca3c54ab..2981f9685da6ebc709d790a88aa9c95fa784845a 100644
--- a/control/descriptor.h
+++ b/control/descriptor.h
@@ -196,6 +196,32 @@ inline static int morse_desc_islocal( const MORSE_desc_t *A, int m, int n )
 #endif /* defined(CHAMELEON_USE_MPI) */
 }
 
+/*******************************************************************************
+ * Declare data accesses of codelets using these macros, for instance:
+ * MORSE_BEGIN_ACCESS_DECLARATION
+ * MORSE_ACCESS_R(A, Am, An)
+ * MORSE_ACCESS_R(B, Bm, Bn)
+ * MORSE_ACCESS_RW(C, Cm, Cn)
+ * MORSE_END_ACCESS_DECLARATION
+ */
+#define MORSE_BEGIN_ACCESS_DECLARATION { \
+    unsigned __morse_need_submit = 0;
+
+#define MORSE_ACCESS_R(A, Am, An) \
+    if (morse_desc_islocal(A, Am, An)) __morse_need_submit = 1;
+
+#define MORSE_ACCESS_W(A, Am, An) \
+    if (morse_desc_islocal(A, Am, An)) __morse_need_submit = 1;
+
+#define MORSE_ACCESS_RW(A, Am, An) \
+    if (morse_desc_islocal(A, Am, An)) __morse_need_submit = 1;
+
+#define MORSE_RANK_CHANGED __morse_need_submit = 1;
+
+#define MORSE_END_ACCESS_DECLARATION \
+    if (!__morse_need_submit) return; \
+}
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/runtime/parsec/codelets/codelet_ztpqrt.c b/runtime/parsec/codelets/codelet_ztpqrt.c
index a0b3f6e06cda9f115f55c9daf904216f131e2b9d..6b8a3fe2d2292570b0ca560672ff3e90ab94c055 100644
--- a/runtime/parsec/codelets/codelet_ztpqrt.c
+++ b/runtime/parsec/codelets/codelet_ztpqrt.c
@@ -78,7 +78,7 @@ void MORSE_TASK_ztpqrt( const MORSE_option_t *options,
         sizeof(int),   &lda, VALUE,
         PASSED_BY_REF,  RTBLKADDR( B, MORSE_Complex64_t, Bm, Bn ), INOUT | REGION_FULL,
         sizeof(int),   &ldb, VALUE,
-        PASSED_BY_REF,  RTBLKADDR( T, MORSE_Complex64_t, Tm, Tn ), INOUT | REGION_FULL,
+        PASSED_BY_REF,  RTBLKADDR( T, MORSE_Complex64_t, Tm, Tn ), OUTPUT | REGION_FULL,
         sizeof(int),   &ldt, VALUE,
         sizeof(MORSE_Complex64_t)*ib*nb, NULL, SCRATCH,
         0);
diff --git a/runtime/starpu/codelets/codelet_zasum.c b/runtime/starpu/codelets/codelet_zasum.c
index 7c17a35d1c8eac5f9144c4a31f7acd7544ef418d..2323b95e6d2a4e72ee6a0b13842c7d31e678132a 100644
--- a/runtime/starpu/codelets/codelet_zasum.c
+++ b/runtime/starpu/codelets/codelet_zasum.c
@@ -35,6 +35,12 @@ void MORSE_TASK_dzasum(const MORSE_option_t *options,
 {
     struct starpu_codelet *codelet = &cl_zasum;
     void (*callback)(void*) = options->profiling ? cl_zasum_callback : NULL;
+
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_R(A, Am, An);
+    MORSE_ACCESS_RW(B, Bm, Bn);
+    MORSE_END_ACCESS_DECLARATION;
+
     starpu_insert_task(
         starpu_mpi_codelet(codelet),
         STARPU_VALUE,    &storev,                sizeof(MORSE_enum),
diff --git a/runtime/starpu/codelets/codelet_zaxpy.c b/runtime/starpu/codelets/codelet_zaxpy.c
index 557eaa1086febacb8b2e7f7befc87945542c8629..56b03bfe80a83d0cf9856e72d261112cb510fff5 100644
--- a/runtime/starpu/codelets/codelet_zaxpy.c
+++ b/runtime/starpu/codelets/codelet_zaxpy.c
@@ -33,23 +33,25 @@ void MORSE_TASK_zaxpy(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zaxpy;
     void (*callback)(void*) = options->profiling ? cl_zaxpy_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) ||
-         morse_desc_islocal( B, Bm, Bn ) ){
-        starpu_insert_task(
-                starpu_mpi_codelet(codelet),
-                STARPU_VALUE,    &M,                           sizeof(int),
-                STARPU_VALUE,    alpha,                       sizeof(MORSE_Complex64_t),
-                STARPU_R,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-                STARPU_VALUE,    &incA,                        sizeof(int),
-                STARPU_RW,       RTBLKADDR(B, MORSE_Complex64_t, Bm, Bn),
-                STARPU_VALUE,    &incB,                        sizeof(int),
-                STARPU_PRIORITY, options->priority,
-                STARPU_CALLBACK, callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_R(A, Am, An);
+    MORSE_ACCESS_RW(B, Bm, Bn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+            starpu_mpi_codelet(codelet),
+            STARPU_VALUE,    &M,                           sizeof(int),
+            STARPU_VALUE,    alpha,                       sizeof(MORSE_Complex64_t),
+            STARPU_R,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+            STARPU_VALUE,    &incA,                        sizeof(int),
+            STARPU_RW,       RTBLKADDR(B, MORSE_Complex64_t, Bm, Bn),
+            STARPU_VALUE,    &incB,                        sizeof(int),
+            STARPU_PRIORITY, options->priority,
+            STARPU_CALLBACK, callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-                STARPU_NAME, "zaxpy",
+            STARPU_NAME, "zaxpy",
 #endif
-                0);
-    }
+            0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_zbuild.c b/runtime/starpu/codelets/codelet_zbuild.c
index d2e654064a626977bb7bada6ec775e972601c2e4..6271384564537e164713f4c5d1fc45a03117509b 100644
--- a/runtime/starpu/codelets/codelet_zbuild.c
+++ b/runtime/starpu/codelets/codelet_zbuild.c
@@ -43,30 +43,30 @@ void MORSE_TASK_zbuild( const MORSE_option_t *options,
   void (*callback)(void*) = options->profiling ? cl_zbuild_callback : NULL;
   int row_min, row_max, col_min, col_max;
 
+  MORSE_BEGIN_ACCESS_DECLARATION;
+  MORSE_ACCESS_W(A, Am, An);
+  MORSE_END_ACCESS_DECLARATION;
 
-  if ( morse_desc_islocal( A, Am, An ) )
-  {
-    row_min = Am*A->mb ;
-    row_max = Am == A->mt-1 ? A->m-1 : row_min+A->mb-1 ;
-    col_min = An*A->nb ;
-    col_max = An == A->nt-1 ? A->n-1 : col_min+A->nb-1 ;
-    starpu_insert_task(
-          starpu_mpi_codelet(codelet),
-          STARPU_VALUE,    &row_min,                      sizeof(int),
-          STARPU_VALUE,    &row_max,                      sizeof(int),
-          STARPU_VALUE,    &col_min,                      sizeof(int),
-          STARPU_VALUE,    &col_max,                      sizeof(int),
-          STARPU_W,         RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-          STARPU_VALUE,    &lda,                          sizeof(int),
-          STARPU_VALUE,    &user_data,                    sizeof(void*),
-          STARPU_VALUE,    &user_build_callback,          sizeof(void*),
-          STARPU_PRIORITY,  options->priority,
-          STARPU_CALLBACK,  callback,
+  row_min = Am*A->mb ;
+  row_max = Am == A->mt-1 ? A->m-1 : row_min+A->mb-1 ;
+  col_min = An*A->nb ;
+  col_max = An == A->nt-1 ? A->n-1 : col_min+A->nb-1 ;
+  starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &row_min,                      sizeof(int),
+        STARPU_VALUE,    &row_max,                      sizeof(int),
+        STARPU_VALUE,    &col_min,                      sizeof(int),
+        STARPU_VALUE,    &col_max,                      sizeof(int),
+        STARPU_W,         RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,    &lda,                          sizeof(int),
+        STARPU_VALUE,    &user_data,                    sizeof(void*),
+        STARPU_VALUE,    &user_build_callback,          sizeof(void*),
+        STARPU_PRIORITY,  options->priority,
+        STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-          STARPU_NAME, "zbuild",
+        STARPU_NAME, "zbuild",
 #endif
-          0);
-  }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_zgeadd.c b/runtime/starpu/codelets/codelet_zgeadd.c
index 1a57e312356b644a2ba23ff55d2c67495d7d05ac..edfd5461b71160c28c5361926ff63dd8d15e8d1c 100644
--- a/runtime/starpu/codelets/codelet_zgeadd.c
+++ b/runtime/starpu/codelets/codelet_zgeadd.c
@@ -91,27 +91,28 @@ void MORSE_TASK_zgeadd(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zgeadd;
     void (*callback)(void*) = options->profiling ? cl_zgeadd_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) ||
-	 morse_desc_islocal( B, Bm, Bn ) )
-    {
-	starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &trans,              sizeof(MORSE_enum),
-            STARPU_VALUE,    &m,                  sizeof(int),
-            STARPU_VALUE,    &n,                  sizeof(int),
-            STARPU_VALUE,    &alpha,              sizeof(MORSE_Complex64_t),
-            STARPU_R,         RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,    &lda,                sizeof(int),
-            STARPU_VALUE,    &beta,               sizeof(MORSE_Complex64_t),
-            STARPU_RW,        RTBLKADDR(B, MORSE_Complex64_t, Bm, Bn),
-            STARPU_VALUE,    &ldb,                sizeof(int),
-            STARPU_PRIORITY,  options->priority,
-            STARPU_CALLBACK,  callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_R(A, Am, An);
+    MORSE_ACCESS_RW(B, Bm, Bn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &trans,              sizeof(MORSE_enum),
+        STARPU_VALUE,    &m,                  sizeof(int),
+        STARPU_VALUE,    &n,                  sizeof(int),
+        STARPU_VALUE,    &alpha,              sizeof(MORSE_Complex64_t),
+        STARPU_R,         RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,    &lda,                sizeof(int),
+        STARPU_VALUE,    &beta,               sizeof(MORSE_Complex64_t),
+        STARPU_RW,        RTBLKADDR(B, MORSE_Complex64_t, Bm, Bn),
+        STARPU_VALUE,    &ldb,                sizeof(int),
+        STARPU_PRIORITY,  options->priority,
+        STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zgeadd",
+        STARPU_NAME, "zgeadd",
 #endif
-            0);
-    }
+        0);
 
     (void)nb;
 }
diff --git a/runtime/starpu/codelets/codelet_zgelqt.c b/runtime/starpu/codelets/codelet_zgelqt.c
index 2b4c0daf8121b4acce12ccbf675a5723bc9cf0ed..af571f2ae79f096aa8efc680c16957b334fa8c48 100644
--- a/runtime/starpu/codelets/codelet_zgelqt.c
+++ b/runtime/starpu/codelets/codelet_zgelqt.c
@@ -104,29 +104,30 @@ void MORSE_TASK_zgelqt(const MORSE_option_t *options,
     void (*callback)(void*) = options->profiling ? cl_zgelqt_callback : NULL;
     MORSE_starpu_ws_t *h_work = (MORSE_starpu_ws_t*)(options->ws_host);
 
-    if ( morse_desc_islocal( A, Am, An ) ||
-         morse_desc_islocal( T, Tm, Tn ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &m,                 sizeof(int),
-            STARPU_VALUE,    &n,                 sizeof(int),
-            STARPU_VALUE,    &ib,                sizeof(int),
-            STARPU_RW,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,    &lda,               sizeof(int),
-            STARPU_W,         RTBLKADDR(T, MORSE_Complex64_t, Tm, Tn),
-            STARPU_VALUE,    &ldt,               sizeof(int),
-            /* max( nb * (ib+1), ib * (ib+nb) ) */
-            STARPU_SCRATCH,   options->ws_worker,
-            /* /\* ib*n + 3*ib*ib + max(m,n) *\/ */
-            STARPU_VALUE,    &h_work,            sizeof(MORSE_starpu_ws_t *),
-            STARPU_PRIORITY,  options->priority,
-            STARPU_CALLBACK,  callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_RW(A, Am, An);
+    MORSE_ACCESS_W(T, Tm, Tn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &m,                 sizeof(int),
+        STARPU_VALUE,    &n,                 sizeof(int),
+        STARPU_VALUE,    &ib,                sizeof(int),
+        STARPU_RW,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,    &lda,               sizeof(int),
+        STARPU_W,         RTBLKADDR(T, MORSE_Complex64_t, Tm, Tn),
+        STARPU_VALUE,    &ldt,               sizeof(int),
+        /* max( nb * (ib+1), ib * (ib+nb) ) */
+        STARPU_SCRATCH,   options->ws_worker,
+        /* /\* ib*n + 3*ib*ib + max(m,n) *\/ */
+        STARPU_VALUE,    &h_work,            sizeof(MORSE_starpu_ws_t *),
+        STARPU_PRIORITY,  options->priority,
+        STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zgelqt",
+        STARPU_NAME, "zgelqt",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_zgemm.c b/runtime/starpu/codelets/codelet_zgemm.c
index d9ba98ff68d151edc28c8dfa5ef023200fd2e508..ed5ff9d571be4c9ccf6f657e286c1338f5c41fa0 100644
--- a/runtime/starpu/codelets/codelet_zgemm.c
+++ b/runtime/starpu/codelets/codelet_zgemm.c
@@ -70,37 +70,38 @@ void MORSE_TASK_zgemm(const MORSE_option_t *options,
         rank_changed = 1;
     }
 
-    if ( morse_desc_islocal( A, Am, An ) ||
-         morse_desc_islocal( B, Bm, Bn ) ||
-         morse_desc_islocal( C, Cm, Cn ) ||
-         rank_changed
-       )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &transA,            sizeof(MORSE_enum),
-            STARPU_VALUE,    &transB,            sizeof(MORSE_enum),
-            STARPU_VALUE,    &m,                 sizeof(int),
-            STARPU_VALUE,    &n,                 sizeof(int),
-            STARPU_VALUE,    &k,                 sizeof(int),
-            STARPU_VALUE,    &alpha,             sizeof(MORSE_Complex64_t),
-            STARPU_R,         RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,    &lda,               sizeof(int),
-            STARPU_R,         RTBLKADDR(B, MORSE_Complex64_t, Bm, Bn),
-            STARPU_VALUE,    &ldb,               sizeof(int),
-            STARPU_VALUE,    &beta,              sizeof(MORSE_Complex64_t),
-            STARPU_RW,        RTBLKADDR(C, MORSE_Complex64_t, Cm, Cn),
-            STARPU_VALUE,    &ldc,               sizeof(int),
-            STARPU_PRIORITY,  options->priority,
-            STARPU_CALLBACK,  callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_R(A, Am, An);
+    MORSE_ACCESS_R(B, Bm, Bn);
+    MORSE_ACCESS_RW(C, Cm, Cn);
+    if (rank_changed)
+        MORSE_RANK_CHANGED;
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &transA,            sizeof(MORSE_enum),
+        STARPU_VALUE,    &transB,            sizeof(MORSE_enum),
+        STARPU_VALUE,    &m,                 sizeof(int),
+        STARPU_VALUE,    &n,                 sizeof(int),
+        STARPU_VALUE,    &k,                 sizeof(int),
+        STARPU_VALUE,    &alpha,             sizeof(MORSE_Complex64_t),
+        STARPU_R,         RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,    &lda,               sizeof(int),
+        STARPU_R,         RTBLKADDR(B, MORSE_Complex64_t, Bm, Bn),
+        STARPU_VALUE,    &ldb,               sizeof(int),
+        STARPU_VALUE,    &beta,              sizeof(MORSE_Complex64_t),
+        STARPU_RW,        RTBLKADDR(C, MORSE_Complex64_t, Cm, Cn),
+        STARPU_VALUE,    &ldc,               sizeof(int),
+        STARPU_PRIORITY,  options->priority,
+        STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_USE_MPI)
-            STARPU_EXECUTE_ON_NODE, execution_rank,
+        STARPU_EXECUTE_ON_NODE, execution_rank,
 #endif
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zgemm",
+        STARPU_NAME, "zgemm",
 #endif
-            0);
-    }
+        0);
 }
 
 #if !defined(CHAMELEON_SIMULATION)
diff --git a/runtime/starpu/codelets/codelet_zgeqrt.c b/runtime/starpu/codelets/codelet_zgeqrt.c
index d738fc0b5a741f683a5d4f5499212cf459a4f172..50769b3be7323b6342f68889c1138d6d4950d1b2 100644
--- a/runtime/starpu/codelets/codelet_zgeqrt.c
+++ b/runtime/starpu/codelets/codelet_zgeqrt.c
@@ -105,29 +105,30 @@ void MORSE_TASK_zgeqrt(const MORSE_option_t *options,
     void (*callback)(void*) = options->profiling ? cl_zgeqrt_callback : NULL;
     MORSE_starpu_ws_t *h_work = (MORSE_starpu_ws_t*)(options->ws_host);
 
-    if ( morse_desc_islocal( A, Am, An ) ||
-         morse_desc_islocal( T, Tm, Tn ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &m,                 sizeof(int),
-            STARPU_VALUE,    &n,                 sizeof(int),
-            STARPU_VALUE,    &ib,                sizeof(int),
-            STARPU_RW,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,    &lda,               sizeof(int),
-            STARPU_W,         RTBLKADDR(T, MORSE_Complex64_t, Tm, Tn),
-            STARPU_VALUE,    &ldt,               sizeof(int),
-            /* max( nb * (ib+1), ib * (ib+nb) ) */
-            STARPU_SCRATCH,   options->ws_worker,
-            /* ib * (m+3*ib) + max(m,n) */
-            STARPU_VALUE,    &h_work,            sizeof(MORSE_starpu_ws_t *),
-            STARPU_PRIORITY,  options->priority,
-            STARPU_CALLBACK,  callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_RW(A, Am, An);
+    MORSE_ACCESS_W(T, Tm, Tn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &m,                 sizeof(int),
+        STARPU_VALUE,    &n,                 sizeof(int),
+        STARPU_VALUE,    &ib,                sizeof(int),
+        STARPU_RW,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,    &lda,               sizeof(int),
+        STARPU_W,         RTBLKADDR(T, MORSE_Complex64_t, Tm, Tn),
+        STARPU_VALUE,    &ldt,               sizeof(int),
+        /* max( nb * (ib+1), ib * (ib+nb) ) */
+        STARPU_SCRATCH,   options->ws_worker,
+        /* ib * (m+3*ib) + max(m,n) */
+        STARPU_VALUE,    &h_work,            sizeof(MORSE_starpu_ws_t *),
+        STARPU_PRIORITY,  options->priority,
+        STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zgeqrt",
+        STARPU_NAME, "zgeqrt",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_zgessm.c b/runtime/starpu/codelets/codelet_zgessm.c
index cabe11ce96babfc59ed50a7e5ea8fbb002394752..547111784edd1c1e30720fbb22e6f4f44d5485dd 100644
--- a/runtime/starpu/codelets/codelet_zgessm.c
+++ b/runtime/starpu/codelets/codelet_zgessm.c
@@ -90,30 +90,31 @@ void MORSE_TASK_zgessm(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zgessm;
     void (*callback)(void*) = options->profiling ? cl_zgessm_callback : NULL;
 
-    if ( morse_desc_islocal( L, Lm, Ln ) ||
-         morse_desc_islocal( D, Dm, Dn ) ||
-         morse_desc_islocal( A, Am, An ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,     &m,                        sizeof(int),
-            STARPU_VALUE,     &n,                        sizeof(int),
-            STARPU_VALUE,     &k,                        sizeof(int),
-            STARPU_VALUE,    &ib,                        sizeof(int),
-            STARPU_VALUE,          &IPIV,                      sizeof(int*),
-            STARPU_R,             RTBLKADDR(L, MORSE_Complex64_t, Lm, Ln),
-            STARPU_VALUE,   &ldl,                        sizeof(int),
-            STARPU_R,             RTBLKADDR(D, MORSE_Complex64_t, Dm, Dn),
-            STARPU_VALUE,   &ldd,                        sizeof(int),
-            STARPU_RW,            RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,   &lda,                        sizeof(int),
-            STARPU_PRIORITY,    options->priority,
-            STARPU_CALLBACK,    callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_R(L, Lm, Ln);
+    MORSE_ACCESS_R(D, Dm, Dn);
+    MORSE_ACCESS_RW(A, Am, An);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,     &m,                        sizeof(int),
+        STARPU_VALUE,     &n,                        sizeof(int),
+        STARPU_VALUE,     &k,                        sizeof(int),
+        STARPU_VALUE,    &ib,                        sizeof(int),
+        STARPU_VALUE,          &IPIV,                      sizeof(int*),
+        STARPU_R,             RTBLKADDR(L, MORSE_Complex64_t, Lm, Ln),
+        STARPU_VALUE,   &ldl,                        sizeof(int),
+        STARPU_R,             RTBLKADDR(D, MORSE_Complex64_t, Dm, Dn),
+        STARPU_VALUE,   &ldd,                        sizeof(int),
+        STARPU_RW,            RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,   &lda,                        sizeof(int),
+        STARPU_PRIORITY,    options->priority,
+        STARPU_CALLBACK,    callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zgessm",
+        STARPU_NAME, "zgessm",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_zgessq.c b/runtime/starpu/codelets/codelet_zgessq.c
index cd229712b59f21dc3fd901dd73faeefff0a00514..094c7ba09e7da55c4774cd6d6ce6f68805e6cd16 100644
--- a/runtime/starpu/codelets/codelet_zgessq.c
+++ b/runtime/starpu/codelets/codelet_zgessq.c
@@ -35,23 +35,24 @@ void MORSE_TASK_zgessq( const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zgessq;
     void (*callback)(void*) = options->profiling ? cl_zgessq_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) ||
-         morse_desc_islocal( SCALESUMSQ, SCALESUMSQm, SCALESUMSQn ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &m,                          sizeof(int),
-            STARPU_VALUE,    &n,                          sizeof(int),
-            STARPU_R,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,    &lda,                        sizeof(int),
-            STARPU_RW,       RTBLKADDR(SCALESUMSQ, double, SCALESUMSQm, SCALESUMSQn),
-            STARPU_PRIORITY, options->priority,
-            STARPU_CALLBACK, callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_R(A, Am, An);
+    MORSE_ACCESS_RW(SCALESUMSQ, SCALESUMSQm, SCALESUMSQn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &m,                          sizeof(int),
+        STARPU_VALUE,    &n,                          sizeof(int),
+        STARPU_R,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,    &lda,                        sizeof(int),
+        STARPU_RW,       RTBLKADDR(SCALESUMSQ, double, SCALESUMSQm, SCALESUMSQn),
+        STARPU_PRIORITY, options->priority,
+        STARPU_CALLBACK, callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zgessq",
+        STARPU_NAME, "zgessq",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_zgetrf.c b/runtime/starpu/codelets/codelet_zgetrf.c
index 54544d0690f06c26e37bca0d76db946ba546da42..e9b5327bfc6ef02a5dbec929ed096cac06ae2dc7 100644
--- a/runtime/starpu/codelets/codelet_zgetrf.c
+++ b/runtime/starpu/codelets/codelet_zgetrf.c
@@ -40,24 +40,25 @@ void MORSE_TASK_zgetrf(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zgetrf;
     void (*callback)(void*) = options->profiling ? cl_zgetrf_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,             &m,                        sizeof(int),
-            STARPU_VALUE,             &n,                        sizeof(int),
-            STARPU_RW,                     RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,           &lda,                        sizeof(int),
-            STARPU_VALUE,                  &IPIV,                      sizeof(int*),
-            STARPU_VALUE,    &check_info,                sizeof(MORSE_bool),
-            STARPU_VALUE,         &iinfo,                        sizeof(int),
-            STARPU_PRIORITY,    options->priority,
-            STARPU_CALLBACK,    callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_RW(A, Am, An);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,             &m,                        sizeof(int),
+        STARPU_VALUE,             &n,                        sizeof(int),
+        STARPU_RW,                     RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,           &lda,                        sizeof(int),
+        STARPU_VALUE,                  &IPIV,                      sizeof(int*),
+        STARPU_VALUE,    &check_info,                sizeof(MORSE_bool),
+        STARPU_VALUE,         &iinfo,                        sizeof(int),
+        STARPU_PRIORITY,    options->priority,
+        STARPU_CALLBACK,    callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zgetrf",
+        STARPU_NAME, "zgetrf",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_zgetrf_incpiv.c b/runtime/starpu/codelets/codelet_zgetrf_incpiv.c
index c76be02aaf3026a9a45bea2173a8d47024e8e86d..ad3475cb764564a20fac78f3afd4b6e063bfe58f 100644
--- a/runtime/starpu/codelets/codelet_zgetrf_incpiv.c
+++ b/runtime/starpu/codelets/codelet_zgetrf_incpiv.c
@@ -100,30 +100,31 @@ void MORSE_TASK_zgetrf_incpiv(const MORSE_option_t *options,
 
     MORSE_starpu_ws_t *h_work = (MORSE_starpu_ws_t*)(options->ws_host);
 
-    if ( morse_desc_islocal( A, Am, An ) ||
-         morse_desc_islocal( L, Lm, Ln ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &m,                 sizeof(int),
-            STARPU_VALUE,    &n,                 sizeof(int),
-            STARPU_VALUE,    &ib,                sizeof(int),
-            STARPU_RW,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,    &lda,               sizeof(int),
-            STARPU_W,         RTBLKADDR(L, MORSE_Complex64_t, Lm, Ln),
-            STARPU_VALUE,    &ldl,               sizeof(int),
-            STARPU_VALUE,    &IPIV,              sizeof(int*),
-            STARPU_VALUE,    &check_info,        sizeof(MORSE_bool),
-            STARPU_VALUE,    &iinfo,             sizeof(int),
-            STARPU_SCRATCH,   options->ws_worker,
-            STARPU_VALUE,    &h_work,            sizeof(MORSE_starpu_ws_t *),
-            STARPU_PRIORITY,  options->priority,
-            STARPU_CALLBACK,  callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_RW(A, Am, An);
+    MORSE_ACCESS_W(L, Lm, Ln);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &m,                 sizeof(int),
+        STARPU_VALUE,    &n,                 sizeof(int),
+        STARPU_VALUE,    &ib,                sizeof(int),
+        STARPU_RW,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,    &lda,               sizeof(int),
+        STARPU_W,         RTBLKADDR(L, MORSE_Complex64_t, Lm, Ln),
+        STARPU_VALUE,    &ldl,               sizeof(int),
+        STARPU_VALUE,    &IPIV,              sizeof(int*),
+        STARPU_VALUE,    &check_info,        sizeof(MORSE_bool),
+        STARPU_VALUE,    &iinfo,             sizeof(int),
+        STARPU_SCRATCH,   options->ws_worker,
+        STARPU_VALUE,    &h_work,            sizeof(MORSE_starpu_ws_t *),
+        STARPU_PRIORITY,  options->priority,
+        STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zgetrf_incpiv",
+        STARPU_NAME, "zgetrf_incpiv",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_zgetrf_nopiv.c b/runtime/starpu/codelets/codelet_zgetrf_nopiv.c
index 3fa0f5c3920b6caf99c5fed29befadfa5168a92f..ab9d87acebd7cfafb43e597c38b3f220e5ac2133 100644
--- a/runtime/starpu/codelets/codelet_zgetrf_nopiv.c
+++ b/runtime/starpu/codelets/codelet_zgetrf_nopiv.c
@@ -85,23 +85,24 @@ void MORSE_TASK_zgetrf_nopiv(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zgetrf_nopiv;
     void (*callback)(void*) = options->profiling ? cl_zgetrf_nopiv_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &m,                         sizeof(int),
-            STARPU_VALUE,    &n,                         sizeof(int),
-            STARPU_VALUE,    &ib,                        sizeof(int),
-            STARPU_RW,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,    &lda,                       sizeof(int),
-            STARPU_VALUE,    &iinfo,                     sizeof(int),
-            STARPU_PRIORITY,  options->priority,
-            STARPU_CALLBACK,  callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_RW(A, Am, An);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &m,                         sizeof(int),
+        STARPU_VALUE,    &n,                         sizeof(int),
+        STARPU_VALUE,    &ib,                        sizeof(int),
+        STARPU_RW,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,    &lda,                       sizeof(int),
+        STARPU_VALUE,    &iinfo,                     sizeof(int),
+        STARPU_PRIORITY,  options->priority,
+        STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zgetrf_nopiv",
+        STARPU_NAME, "zgetrf_nopiv",
 #endif
-            0);
-    }
+        0);
 }
 
 /*
diff --git a/runtime/starpu/codelets/codelet_zhe2ge.c b/runtime/starpu/codelets/codelet_zhe2ge.c
index f107252cc70a863a5774da37f9ea6aa2000a6327..6551a8fbb0fe55b06a341c55f0e8aa17345bb59a 100644
--- a/runtime/starpu/codelets/codelet_zhe2ge.c
+++ b/runtime/starpu/codelets/codelet_zhe2ge.c
@@ -39,25 +39,26 @@ void MORSE_TASK_zhe2ge(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zhe2ge;
     void (*callback)(void*) = options->profiling ? cl_zhe2ge_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) ||
-         morse_desc_islocal( B, Bm, Bn ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,  &uplo,                sizeof(MORSE_enum),
-            STARPU_VALUE,     &m,                        sizeof(int),
-            STARPU_VALUE,     &n,                        sizeof(int),
-            STARPU_R,             RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,   &lda,                        sizeof(int),
-            STARPU_W,             RTBLKADDR(B, MORSE_Complex64_t, Bm, Bn),
-            STARPU_VALUE,   &ldb,                        sizeof(int),
-            STARPU_PRIORITY,    options->priority,
-            STARPU_CALLBACK,    callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_R(A, Am, An);
+    MORSE_ACCESS_W(B, Bm, Bn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,  &uplo,                sizeof(MORSE_enum),
+        STARPU_VALUE,     &m,                        sizeof(int),
+        STARPU_VALUE,     &n,                        sizeof(int),
+        STARPU_R,             RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,   &lda,                        sizeof(int),
+        STARPU_W,             RTBLKADDR(B, MORSE_Complex64_t, Bm, Bn),
+        STARPU_VALUE,   &ldb,                        sizeof(int),
+        STARPU_PRIORITY,    options->priority,
+        STARPU_CALLBACK,    callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zhe2ge",
+        STARPU_NAME, "zhe2ge",
 #endif
-            0);
-    }
+        0);
 }
 
 #if !defined(CHAMELEON_SIMULATION)
diff --git a/runtime/starpu/codelets/codelet_zhemm.c b/runtime/starpu/codelets/codelet_zhemm.c
index 4489e84ad443df55c9a5762657fc7fc9d8ec341d..df45234630fbd77f77f7e976eea77cba868c305b 100644
--- a/runtime/starpu/codelets/codelet_zhemm.c
+++ b/runtime/starpu/codelets/codelet_zhemm.c
@@ -48,31 +48,32 @@ void MORSE_TASK_zhemm(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zhemm;
     void (*callback)(void*) = options->profiling ? cl_zhemm_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) ||
-         morse_desc_islocal( B, Bm, Bn ) ||
-         morse_desc_islocal( C, Cm, Cn ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &side,                sizeof(MORSE_enum),
-            STARPU_VALUE,    &uplo,                sizeof(MORSE_enum),
-            STARPU_VALUE,       &m,                        sizeof(int),
-            STARPU_VALUE,       &n,                        sizeof(int),
-            STARPU_VALUE,   &alpha,         sizeof(MORSE_Complex64_t),
-            STARPU_R,               RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,     &lda,                        sizeof(int),
-            STARPU_R,               RTBLKADDR(B, MORSE_Complex64_t, Bm, Bn),
-            STARPU_VALUE,     &ldb,                        sizeof(int),
-            STARPU_VALUE,    &beta,         sizeof(MORSE_Complex64_t),
-            STARPU_RW,               RTBLKADDR(C, MORSE_Complex64_t, Cm, Cn),
-            STARPU_VALUE,     &ldc,                        sizeof(int),
-            STARPU_PRIORITY,    options->priority,
-            STARPU_CALLBACK,    callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_R(A, Am, An);
+    MORSE_ACCESS_R(B, Bm, Bn);
+    MORSE_ACCESS_RW(C, Cm, Cn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &side,                sizeof(MORSE_enum),
+        STARPU_VALUE,    &uplo,                sizeof(MORSE_enum),
+        STARPU_VALUE,       &m,                        sizeof(int),
+        STARPU_VALUE,       &n,                        sizeof(int),
+        STARPU_VALUE,   &alpha,         sizeof(MORSE_Complex64_t),
+        STARPU_R,               RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,     &lda,                        sizeof(int),
+        STARPU_R,               RTBLKADDR(B, MORSE_Complex64_t, Bm, Bn),
+        STARPU_VALUE,     &ldb,                        sizeof(int),
+        STARPU_VALUE,    &beta,         sizeof(MORSE_Complex64_t),
+        STARPU_RW,               RTBLKADDR(C, MORSE_Complex64_t, Cm, Cn),
+        STARPU_VALUE,     &ldc,                        sizeof(int),
+        STARPU_PRIORITY,    options->priority,
+        STARPU_CALLBACK,    callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zhemm",
+        STARPU_NAME, "zhemm",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_zher2k.c b/runtime/starpu/codelets/codelet_zher2k.c
index 78a4d6f137c9a037a9555b1b88571da4301de11a..9b6b7194db42d17a7fb5eb755efc76ec7c79c09b 100644
--- a/runtime/starpu/codelets/codelet_zher2k.c
+++ b/runtime/starpu/codelets/codelet_zher2k.c
@@ -48,31 +48,32 @@ void MORSE_TASK_zher2k(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zher2k;
     void (*callback)(void*) = options->profiling ? cl_zher2k_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) ||
-         morse_desc_islocal( B, Bm, Bn ) ||
-         morse_desc_islocal( C, Cm, Cn ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,      &uplo,                sizeof(MORSE_enum),
-            STARPU_VALUE,     &trans,                sizeof(MORSE_enum),
-            STARPU_VALUE,         &n,                        sizeof(int),
-            STARPU_VALUE,         &k,                        sizeof(int),
-            STARPU_VALUE,     &alpha,         sizeof(MORSE_Complex64_t),
-            STARPU_R,                 RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,       &lda,                        sizeof(int),
-            STARPU_R,                 RTBLKADDR(B, MORSE_Complex64_t, Bm, Bn),
-            STARPU_VALUE,       &ldb,                        sizeof(int),
-            STARPU_VALUE,      &beta,                     sizeof(double),
-            STARPU_RW,                 RTBLKADDR(C, MORSE_Complex64_t, Cm, Cn),
-            STARPU_VALUE,       &ldc,                        sizeof(int),
-            STARPU_PRIORITY,    options->priority,
-            STARPU_CALLBACK,    callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_R(A, Am, An);
+    MORSE_ACCESS_R(B, Bm, Bn);
+    MORSE_ACCESS_RW(C, Cm, Cn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,      &uplo,                sizeof(MORSE_enum),
+        STARPU_VALUE,     &trans,                sizeof(MORSE_enum),
+        STARPU_VALUE,         &n,                        sizeof(int),
+        STARPU_VALUE,         &k,                        sizeof(int),
+        STARPU_VALUE,     &alpha,         sizeof(MORSE_Complex64_t),
+        STARPU_R,                 RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,       &lda,                        sizeof(int),
+        STARPU_R,                 RTBLKADDR(B, MORSE_Complex64_t, Bm, Bn),
+        STARPU_VALUE,       &ldb,                        sizeof(int),
+        STARPU_VALUE,      &beta,                     sizeof(double),
+        STARPU_RW,                 RTBLKADDR(C, MORSE_Complex64_t, Cm, Cn),
+        STARPU_VALUE,       &ldc,                        sizeof(int),
+        STARPU_PRIORITY,    options->priority,
+        STARPU_CALLBACK,    callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zher2k",
+        STARPU_NAME, "zher2k",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_zherfb.c b/runtime/starpu/codelets/codelet_zherfb.c
index 210fb3278ab53ffdee9805b1a7061696669e9a46..b5ceec04b8ded9bf733c534645ae7a5303294b5b 100644
--- a/runtime/starpu/codelets/codelet_zherfb.c
+++ b/runtime/starpu/codelets/codelet_zherfb.c
@@ -40,32 +40,33 @@ void MORSE_TASK_zherfb(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zherfb;
     void (*callback)(void*) = options->profiling ? cl_zherfb_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) ||
-         morse_desc_islocal( T, Tm, Tn ) ||
-         morse_desc_islocal( C, Cm, Cn ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &uplo,              sizeof(MORSE_enum),
-            STARPU_VALUE,    &n,                 sizeof(int),
-            STARPU_VALUE,    &k,                 sizeof(int),
-            STARPU_VALUE,    &ib,                sizeof(int),
-            STARPU_VALUE,    &nb,                sizeof(int),
-            STARPU_R,         RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,    &lda,               sizeof(int),
-            STARPU_R,         RTBLKADDR(T, MORSE_Complex64_t, Tm, Tn),
-            STARPU_VALUE,    &ldt,               sizeof(int),
-            STARPU_RW,        RTBLKADDR(C, MORSE_Complex64_t, Cm, Cn),
-            STARPU_VALUE,    &ldc,               sizeof(int),
-            STARPU_SCRATCH,   options->ws_worker,
-            STARPU_VALUE,    &nb,                sizeof(int),
-            STARPU_PRIORITY,  options->priority,
-            STARPU_CALLBACK,  callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_R(A, Am, An);
+    MORSE_ACCESS_R(T, Tm, Tn);
+    MORSE_ACCESS_RW(C, Cm, Cn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &uplo,              sizeof(MORSE_enum),
+        STARPU_VALUE,    &n,                 sizeof(int),
+        STARPU_VALUE,    &k,                 sizeof(int),
+        STARPU_VALUE,    &ib,                sizeof(int),
+        STARPU_VALUE,    &nb,                sizeof(int),
+        STARPU_R,         RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,    &lda,               sizeof(int),
+        STARPU_R,         RTBLKADDR(T, MORSE_Complex64_t, Tm, Tn),
+        STARPU_VALUE,    &ldt,               sizeof(int),
+        STARPU_RW,        RTBLKADDR(C, MORSE_Complex64_t, Cm, Cn),
+        STARPU_VALUE,    &ldc,               sizeof(int),
+        STARPU_SCRATCH,   options->ws_worker,
+        STARPU_VALUE,    &nb,                sizeof(int),
+        STARPU_PRIORITY,  options->priority,
+        STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zherfb",
+        STARPU_NAME, "zherfb",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_zherk.c b/runtime/starpu/codelets/codelet_zherk.c
index 8e0d48f6f41c0751db73210ab67756c29217df1c..e5ef780218f5cf95f13f6956b971350d38268b8f 100644
--- a/runtime/starpu/codelets/codelet_zherk.c
+++ b/runtime/starpu/codelets/codelet_zherk.c
@@ -47,28 +47,29 @@ void MORSE_TASK_zherk(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zherk;
     void (*callback)(void*) = options->profiling ? cl_zherk_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) ||
-	 morse_desc_islocal( C, Cm, Cn ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &uplo,              sizeof(MORSE_enum),
-            STARPU_VALUE,    &trans,             sizeof(MORSE_enum),
-            STARPU_VALUE,    &n,                 sizeof(int),
-            STARPU_VALUE,    &k,                 sizeof(int),
-            STARPU_VALUE,    &alpha,             sizeof(double),
-            STARPU_R,         RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,    &lda,               sizeof(int),
-            STARPU_VALUE,    &beta,              sizeof(double),
-            STARPU_RW,        RTBLKADDR(C, MORSE_Complex64_t, Cm, Cn),
-            STARPU_VALUE,    &ldc,               sizeof(int),
-            STARPU_PRIORITY,  options->priority,
-            STARPU_CALLBACK,  callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_R(A, Am, An);
+    MORSE_ACCESS_RW(C, Cm, Cn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &uplo,              sizeof(MORSE_enum),
+        STARPU_VALUE,    &trans,             sizeof(MORSE_enum),
+        STARPU_VALUE,    &n,                 sizeof(int),
+        STARPU_VALUE,    &k,                 sizeof(int),
+        STARPU_VALUE,    &alpha,             sizeof(double),
+        STARPU_R,         RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,    &lda,               sizeof(int),
+        STARPU_VALUE,    &beta,              sizeof(double),
+        STARPU_RW,        RTBLKADDR(C, MORSE_Complex64_t, Cm, Cn),
+        STARPU_VALUE,    &ldc,               sizeof(int),
+        STARPU_PRIORITY,  options->priority,
+        STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zherk",
+        STARPU_NAME, "zherk",
 #endif
-            0);
-    }
+        0);
 }
 
 #if !defined(CHAMELEON_SIMULATION)
diff --git a/runtime/starpu/codelets/codelet_zhessq.c b/runtime/starpu/codelets/codelet_zhessq.c
index 11666dbce7ab3dcd260b47f1097b24e00cc0326d..8f9ddf984bfb5533e6c93e6c9eabd636cd7cddd5 100644
--- a/runtime/starpu/codelets/codelet_zhessq.c
+++ b/runtime/starpu/codelets/codelet_zhessq.c
@@ -35,23 +35,24 @@ void MORSE_TASK_zhessq( const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zhessq;
     void (*callback)(void*) = options->profiling ? cl_zgessq_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) ||
-         morse_desc_islocal( SCALESUMSQ, SCALESUMSQm, SCALESUMSQn ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &uplo,                       sizeof(MORSE_enum),
-            STARPU_VALUE,    &n,                          sizeof(int),
-            STARPU_R,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,    &lda,                        sizeof(int),
-            STARPU_RW,       RTBLKADDR(SCALESUMSQ, double, SCALESUMSQm, SCALESUMSQn),
-            STARPU_PRIORITY, options->priority,
-            STARPU_CALLBACK, callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_R(A, Am, An);
+    MORSE_ACCESS_RW(SCALESUMSQ, SCALESUMSQm, SCALESUMSQn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &uplo,                       sizeof(MORSE_enum),
+        STARPU_VALUE,    &n,                          sizeof(int),
+        STARPU_R,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,    &lda,                        sizeof(int),
+        STARPU_RW,       RTBLKADDR(SCALESUMSQ, double, SCALESUMSQm, SCALESUMSQn),
+        STARPU_PRIORITY, options->priority,
+        STARPU_CALLBACK, callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zhessq",
+        STARPU_NAME, "zhessq",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_zlacpy.c b/runtime/starpu/codelets/codelet_zlacpy.c
index ee86f5d18efef05a17b147c0f4689bed0b212fe8..99274e18383f14a36c6e117528eeabbf483aaf49 100644
--- a/runtime/starpu/codelets/codelet_zlacpy.c
+++ b/runtime/starpu/codelets/codelet_zlacpy.c
@@ -47,27 +47,28 @@ void MORSE_TASK_zlacpyx(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zlacpy;
     void (*callback)(void*) = options->profiling ? cl_zlacpy_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) ||
-         morse_desc_islocal( B, Bm, Bn ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,   &uplo,                sizeof(MORSE_enum),
-            STARPU_VALUE,   &m,                   sizeof(int),
-            STARPU_VALUE,   &n,                   sizeof(int),
-            STARPU_VALUE,   &displA,              sizeof(int),
-            STARPU_R,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,   &lda,                 sizeof(int),
-            STARPU_VALUE,   &displB,              sizeof(int),
-            STARPU_W,        RTBLKADDR(B, MORSE_Complex64_t, Bm, Bn),
-            STARPU_VALUE,   &ldb,                 sizeof(int),
-            STARPU_PRIORITY, options->priority,
-            STARPU_CALLBACK, callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_R(A, Am, An);
+    MORSE_ACCESS_W(B, Bm, Bn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,   &uplo,                sizeof(MORSE_enum),
+        STARPU_VALUE,   &m,                   sizeof(int),
+        STARPU_VALUE,   &n,                   sizeof(int),
+        STARPU_VALUE,   &displA,              sizeof(int),
+        STARPU_R,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,   &lda,                 sizeof(int),
+        STARPU_VALUE,   &displB,              sizeof(int),
+        STARPU_W,        RTBLKADDR(B, MORSE_Complex64_t, Bm, Bn),
+        STARPU_VALUE,   &ldb,                 sizeof(int),
+        STARPU_PRIORITY, options->priority,
+        STARPU_CALLBACK, callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zlacpy",
+        STARPU_NAME, "zlacpy",
 #endif
-            0);
-    }
+        0);
 }
 
 void MORSE_TASK_zlacpy(const MORSE_option_t *options,
diff --git a/runtime/starpu/codelets/codelet_zlag2c.c b/runtime/starpu/codelets/codelet_zlag2c.c
index 7390acaae69b5e5d3e95d5ea8995e98a95a63bfc..f09c80846b3ba17e2decea7b2aed145c1c858c66 100644
--- a/runtime/starpu/codelets/codelet_zlag2c.c
+++ b/runtime/starpu/codelets/codelet_zlag2c.c
@@ -44,24 +44,25 @@ void MORSE_TASK_zlag2c(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zlag2c;
     void (*callback)(void*) = options->profiling ? cl_zlag2c_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) ||
-         morse_desc_islocal( B, Bm, Bn ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &m,                 sizeof(int),
-            STARPU_VALUE,    &n,                 sizeof(int),
-            STARPU_R,         RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,    &lda,               sizeof(int),
-            STARPU_W,         RTBLKADDR(B, MORSE_Complex32_t, Bm, Bn),
-            STARPU_VALUE,    &ldb,               sizeof(int),
-            STARPU_PRIORITY,  options->priority,
-            STARPU_CALLBACK,  callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_R(A, Am, An);
+    MORSE_ACCESS_W(B, Bm, Bn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &m,                 sizeof(int),
+        STARPU_VALUE,    &n,                 sizeof(int),
+        STARPU_R,         RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,    &lda,               sizeof(int),
+        STARPU_W,         RTBLKADDR(B, MORSE_Complex32_t, Bm, Bn),
+        STARPU_VALUE,    &ldb,               sizeof(int),
+        STARPU_PRIORITY,  options->priority,
+        STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zlag2c",
+        STARPU_NAME, "zlag2c",
 #endif
-            0);
-    }
+        0);
 }
 
 #if !defined(CHAMELEON_SIMULATION)
diff --git a/runtime/starpu/codelets/codelet_zlange.c b/runtime/starpu/codelets/codelet_zlange.c
index 9a1b1ebcf01d0a7fcf1a500ff4d3086179f3d3b9..9571eec74fdafabafd27866d5de9a040857fdad8 100644
--- a/runtime/starpu/codelets/codelet_zlange.c
+++ b/runtime/starpu/codelets/codelet_zlange.c
@@ -39,25 +39,26 @@ void MORSE_TASK_zlange(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zlange;
     void (*callback)(void*) = options->profiling ? cl_zlange_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) ||
-         morse_desc_islocal( B, Bm, Bn ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &norm,              sizeof(MORSE_enum),
-            STARPU_VALUE,    &M,                 sizeof(int),
-            STARPU_VALUE,    &N,                 sizeof(int),
-            STARPU_R,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,    &LDA,               sizeof(int),
-            STARPU_SCRATCH,  options->ws_worker,
-            STARPU_W,        RTBLKADDR(B, double, Bm, Bn),
-            STARPU_PRIORITY, options->priority,
-            STARPU_CALLBACK, callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_R(A, Am, An);
+    MORSE_ACCESS_W(B, Bm, Bn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &norm,              sizeof(MORSE_enum),
+        STARPU_VALUE,    &M,                 sizeof(int),
+        STARPU_VALUE,    &N,                 sizeof(int),
+        STARPU_R,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,    &LDA,               sizeof(int),
+        STARPU_SCRATCH,  options->ws_worker,
+        STARPU_W,        RTBLKADDR(B, double, Bm, Bn),
+        STARPU_PRIORITY, options->priority,
+        STARPU_CALLBACK, callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zlange",
+        STARPU_NAME, "zlange",
 #endif
-            0);
-    }
+        0);
 }
 
 #if !defined(CHAMELEON_SIMULATION)
diff --git a/runtime/starpu/codelets/codelet_zlanhe.c b/runtime/starpu/codelets/codelet_zlanhe.c
index 24a87f7525e82f2427c9b854b2661a3ef1bcbf55..37725f178d09623af6933cc63217a0ddb8d8ea14 100644
--- a/runtime/starpu/codelets/codelet_zlanhe.c
+++ b/runtime/starpu/codelets/codelet_zlanhe.c
@@ -37,25 +37,26 @@ void MORSE_TASK_zlanhe(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zlanhe;
     void (*callback)(void*) = options->profiling ? cl_zlange_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) ||
-         morse_desc_islocal( B, Bm, Bn ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &norm,              sizeof(MORSE_enum),
-            STARPU_VALUE,    &uplo,              sizeof(MORSE_enum),
-            STARPU_VALUE,    &N,                 sizeof(int),
-            STARPU_R,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,    &LDA,               sizeof(int),
-            STARPU_SCRATCH,  options->ws_worker,
-            STARPU_W,        RTBLKADDR(B, double, Bm, Bn),
-            STARPU_PRIORITY, options->priority,
-            STARPU_CALLBACK, callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_R(A, Am, An);
+    MORSE_ACCESS_W(B, Bm, Bn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &norm,              sizeof(MORSE_enum),
+        STARPU_VALUE,    &uplo,              sizeof(MORSE_enum),
+        STARPU_VALUE,    &N,                 sizeof(int),
+        STARPU_R,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,    &LDA,               sizeof(int),
+        STARPU_SCRATCH,  options->ws_worker,
+        STARPU_W,        RTBLKADDR(B, double, Bm, Bn),
+        STARPU_PRIORITY, options->priority,
+        STARPU_CALLBACK, callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zlanhe",
+        STARPU_NAME, "zlanhe",
 #endif
-            0);
-    }
+        0);
 
     (void)NB;
 }
diff --git a/runtime/starpu/codelets/codelet_zlansy.c b/runtime/starpu/codelets/codelet_zlansy.c
index 0e3fe5933c241be87004ae3582cd6dcd22954ae1..dd01215c23e4da1334215d5e54124b1f51bda397 100644
--- a/runtime/starpu/codelets/codelet_zlansy.c
+++ b/runtime/starpu/codelets/codelet_zlansy.c
@@ -39,25 +39,26 @@ void MORSE_TASK_zlansy(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zlansy;
     void (*callback)(void*) = options->profiling ? cl_zlange_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) ||
-         morse_desc_islocal( B, Bm, Bn ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &norm,              sizeof(MORSE_enum),
-            STARPU_VALUE,    &uplo,              sizeof(MORSE_enum),
-            STARPU_VALUE,    &N,                 sizeof(int),
-            STARPU_R,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,    &LDA,               sizeof(int),
-            STARPU_SCRATCH,  options->ws_worker,
-            STARPU_W,        RTBLKADDR(B, double, Bm, Bn),
-            STARPU_PRIORITY, options->priority,
-            STARPU_CALLBACK, callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_R(A, Am, An);
+    MORSE_ACCESS_W(B, Bm, Bn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &norm,              sizeof(MORSE_enum),
+        STARPU_VALUE,    &uplo,              sizeof(MORSE_enum),
+        STARPU_VALUE,    &N,                 sizeof(int),
+        STARPU_R,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,    &LDA,               sizeof(int),
+        STARPU_SCRATCH,  options->ws_worker,
+        STARPU_W,        RTBLKADDR(B, double, Bm, Bn),
+        STARPU_PRIORITY, options->priority,
+        STARPU_CALLBACK, callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zlansy",
+        STARPU_NAME, "zlansy",
 #endif
-            0);
-    }
+        0);
 }
 
 #if !defined(CHAMELEON_SIMULATION)
diff --git a/runtime/starpu/codelets/codelet_zlantr.c b/runtime/starpu/codelets/codelet_zlantr.c
index c6815973f6c4c92330f76ad5a6334cd9f834fe80..e950fd7e2606f3a19462cf89bffcd83066d38170 100644
--- a/runtime/starpu/codelets/codelet_zlantr.c
+++ b/runtime/starpu/codelets/codelet_zlantr.c
@@ -36,27 +36,28 @@ void MORSE_TASK_zlantr(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zlantr;
     void (*callback)(void*) = options->profiling ? cl_zlange_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) ||
-         morse_desc_islocal( B, Bm, Bn ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &norm,              sizeof(MORSE_enum),
-            STARPU_VALUE,    &uplo,              sizeof(MORSE_enum),
-            STARPU_VALUE,    &diag,              sizeof(MORSE_enum),
-            STARPU_VALUE,    &M,                 sizeof(int),
-            STARPU_VALUE,    &N,                 sizeof(int),
-            STARPU_R,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,    &LDA,               sizeof(int),
-            STARPU_SCRATCH,  options->ws_worker,
-            STARPU_W,        RTBLKADDR(B, double, Bm, Bn),
-            STARPU_PRIORITY, options->priority,
-            STARPU_CALLBACK, callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_R(A, Am, An);
+    MORSE_ACCESS_W(B, Bm, Bn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &norm,              sizeof(MORSE_enum),
+        STARPU_VALUE,    &uplo,              sizeof(MORSE_enum),
+        STARPU_VALUE,    &diag,              sizeof(MORSE_enum),
+        STARPU_VALUE,    &M,                 sizeof(int),
+        STARPU_VALUE,    &N,                 sizeof(int),
+        STARPU_R,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,    &LDA,               sizeof(int),
+        STARPU_SCRATCH,  options->ws_worker,
+        STARPU_W,        RTBLKADDR(B, double, Bm, Bn),
+        STARPU_PRIORITY, options->priority,
+        STARPU_CALLBACK, callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zlantr",
+        STARPU_NAME, "zlantr",
 #endif
-            0);
-    }
+        0);
 
     (void)NB;
 }
diff --git a/runtime/starpu/codelets/codelet_zlascal.c b/runtime/starpu/codelets/codelet_zlascal.c
index 445ee1c318e4d55e804b9d7dfa8b92c0cb351898..614962ed4e5420d504e64a2f0ba4b10df3fa0e24 100644
--- a/runtime/starpu/codelets/codelet_zlascal.c
+++ b/runtime/starpu/codelets/codelet_zlascal.c
@@ -71,23 +71,24 @@ void MORSE_TASK_zlascal(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zlascal;
     void (*callback)(void*) = options->profiling ? cl_zlascal_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ))
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &uplo,              sizeof(MORSE_enum),
-            STARPU_VALUE,    &m,                  sizeof(int),
-            STARPU_VALUE,    &n,                  sizeof(int),
-            STARPU_VALUE,    &alpha,              sizeof(MORSE_Complex64_t),
-            STARPU_RW,         RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,    &lda,                sizeof(int),
-            STARPU_PRIORITY,  options->priority,
-            STARPU_CALLBACK,  callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_RW(A, Am, An);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &uplo,              sizeof(MORSE_enum),
+        STARPU_VALUE,    &m,                  sizeof(int),
+        STARPU_VALUE,    &n,                  sizeof(int),
+        STARPU_VALUE,    &alpha,              sizeof(MORSE_Complex64_t),
+        STARPU_RW,         RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,    &lda,                sizeof(int),
+        STARPU_PRIORITY,  options->priority,
+        STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zlascal",
+        STARPU_NAME, "zlascal",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_zlaset.c b/runtime/starpu/codelets/codelet_zlaset.c
index 639acdb5658de9538d9ae71eb4784dc29b2c2bf4..fcba9efaa1de298206aefb5afa87afb065ab8eab 100644
--- a/runtime/starpu/codelets/codelet_zlaset.c
+++ b/runtime/starpu/codelets/codelet_zlaset.c
@@ -77,24 +77,25 @@ void MORSE_TASK_zlaset(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zlaset;
     void (*callback)(void*) = options->profiling ? cl_zlaset_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,  &uplo,                sizeof(MORSE_enum),
-            STARPU_VALUE,     &M,                        sizeof(int),
-            STARPU_VALUE,     &N,                        sizeof(int),
-            STARPU_VALUE, &alpha,         sizeof(MORSE_Complex64_t),
-            STARPU_VALUE,  &beta,         sizeof(MORSE_Complex64_t),
-            STARPU_W,      RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,   &LDA,                        sizeof(int),
-            STARPU_PRIORITY,    options->priority,
-            STARPU_CALLBACK,    callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_W(A, Am, An);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,  &uplo,                sizeof(MORSE_enum),
+        STARPU_VALUE,     &M,                        sizeof(int),
+        STARPU_VALUE,     &N,                        sizeof(int),
+        STARPU_VALUE, &alpha,         sizeof(MORSE_Complex64_t),
+        STARPU_VALUE,  &beta,         sizeof(MORSE_Complex64_t),
+        STARPU_W,      RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,   &LDA,                        sizeof(int),
+        STARPU_PRIORITY,    options->priority,
+        STARPU_CALLBACK,    callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zlaset",
+        STARPU_NAME, "zlaset",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_zlaset2.c b/runtime/starpu/codelets/codelet_zlaset2.c
index ac9e8fda8f83acd4d7a75bb0843a3e7dbc1efd35..0d5efc1de99e772b81572793b1ec21a0aa6d2e9d 100644
--- a/runtime/starpu/codelets/codelet_zlaset2.c
+++ b/runtime/starpu/codelets/codelet_zlaset2.c
@@ -74,23 +74,24 @@ void MORSE_TASK_zlaset2(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zlaset2;
     void (*callback)(void*) = options->profiling ? cl_zlaset2_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,  &uplo,                sizeof(MORSE_enum),
-            STARPU_VALUE,     &M,                        sizeof(int),
-            STARPU_VALUE,     &N,                        sizeof(int),
-            STARPU_VALUE, &alpha,         sizeof(MORSE_Complex64_t),
-            STARPU_W,      RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,   &LDA,                        sizeof(int),
-            STARPU_PRIORITY,    options->priority,
-            STARPU_CALLBACK,    callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_W(A, Am, An);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,  &uplo,                sizeof(MORSE_enum),
+        STARPU_VALUE,     &M,                        sizeof(int),
+        STARPU_VALUE,     &N,                        sizeof(int),
+        STARPU_VALUE, &alpha,         sizeof(MORSE_Complex64_t),
+        STARPU_W,      RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,   &LDA,                        sizeof(int),
+        STARPU_PRIORITY,    options->priority,
+        STARPU_CALLBACK,    callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zlaset2",
+        STARPU_NAME, "zlaset2",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_zlatro.c b/runtime/starpu/codelets/codelet_zlatro.c
index 29345b4424a13aa2de6b9eec195d52a7430665ac..9faa75eb64cafc605c736e0f79e17f3a15aabf1f 100644
--- a/runtime/starpu/codelets/codelet_zlatro.c
+++ b/runtime/starpu/codelets/codelet_zlatro.c
@@ -47,26 +47,27 @@ void MORSE_TASK_zlatro(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zlatro;
     void (*callback)(void*) = NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) ||
-         morse_desc_islocal( B, Bm, Bn ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,   &uplo,    sizeof(MORSE_enum),
-            STARPU_VALUE,   &trans,   sizeof(MORSE_enum),
-            STARPU_VALUE,   &m,       sizeof(int),
-            STARPU_VALUE,   &n,       sizeof(int),
-            STARPU_R,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,   &lda,     sizeof(int),
-            STARPU_W,        RTBLKADDR(B, MORSE_Complex64_t, Bm, Bn),
-            STARPU_VALUE,   &ldb,     sizeof(int),
-            STARPU_PRIORITY, options->priority,
-            STARPU_CALLBACK, callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_R(A, Am, An);
+    MORSE_ACCESS_W(B, Bm, Bn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,   &uplo,    sizeof(MORSE_enum),
+        STARPU_VALUE,   &trans,   sizeof(MORSE_enum),
+        STARPU_VALUE,   &m,       sizeof(int),
+        STARPU_VALUE,   &n,       sizeof(int),
+        STARPU_R,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,   &lda,     sizeof(int),
+        STARPU_W,        RTBLKADDR(B, MORSE_Complex64_t, Bm, Bn),
+        STARPU_VALUE,   &ldb,     sizeof(int),
+        STARPU_PRIORITY, options->priority,
+        STARPU_CALLBACK, callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zlatro",
+        STARPU_NAME, "zlatro",
 #endif
-            0);
-    }
+        0);
     (void)mb;
 }
 
diff --git a/runtime/starpu/codelets/codelet_zlauum.c b/runtime/starpu/codelets/codelet_zlauum.c
index 1f5876bd25a9e7fafcb46e305e2593f5229ddb4c..f578695ff8599d3a0804d44f38d75ecf7125771a 100644
--- a/runtime/starpu/codelets/codelet_zlauum.c
+++ b/runtime/starpu/codelets/codelet_zlauum.c
@@ -46,21 +46,22 @@ void MORSE_TASK_zlauum(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zlauum;
     void (*callback)(void*) = options->profiling ? cl_zlauum_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &uplo,              sizeof(MORSE_enum),
-            STARPU_VALUE,    &n,                 sizeof(int),
-            STARPU_RW,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,    &lda,               sizeof(int),
-            STARPU_PRIORITY,  options->priority,
-            STARPU_CALLBACK,  callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_RW(A, Am, An);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &uplo,              sizeof(MORSE_enum),
+        STARPU_VALUE,    &n,                 sizeof(int),
+        STARPU_RW,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,    &lda,               sizeof(int),
+        STARPU_PRIORITY,  options->priority,
+        STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zlauum",
+        STARPU_NAME, "zlauum",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_zplghe.c b/runtime/starpu/codelets/codelet_zplghe.c
index de57291a5c48f4abe986d07b6026a2f3b0ff8b19..79ff9238fa36e4fe5ddfaf0c8f2ea8ac9d6a38b8 100644
--- a/runtime/starpu/codelets/codelet_zplghe.c
+++ b/runtime/starpu/codelets/codelet_zplghe.c
@@ -41,26 +41,27 @@ void MORSE_TASK_zplghe( const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zplghe;
     void (*callback)(void*) = options->profiling ? cl_zplghe_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE, &bump,                   sizeof(double),
-            STARPU_VALUE,    &m,                      sizeof(int),
-            STARPU_VALUE,    &n,                      sizeof(int),
-            STARPU_W,         RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,  &lda,                      sizeof(int),
-            STARPU_VALUE, &bigM,                      sizeof(int),
-            STARPU_VALUE,   &m0,                      sizeof(int),
-            STARPU_VALUE,   &n0,                      sizeof(int),
-            STARPU_VALUE, &seed,   sizeof(unsigned long long int),
-            STARPU_PRIORITY,    options->priority,
-            STARPU_CALLBACK,    callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_W(A, Am, An);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE, &bump,                   sizeof(double),
+        STARPU_VALUE,    &m,                      sizeof(int),
+        STARPU_VALUE,    &n,                      sizeof(int),
+        STARPU_W,         RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,  &lda,                      sizeof(int),
+        STARPU_VALUE, &bigM,                      sizeof(int),
+        STARPU_VALUE,   &m0,                      sizeof(int),
+        STARPU_VALUE,   &n0,                      sizeof(int),
+        STARPU_VALUE, &seed,   sizeof(unsigned long long int),
+        STARPU_PRIORITY,    options->priority,
+        STARPU_CALLBACK,    callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zplghe",
+        STARPU_NAME, "zplghe",
 #endif
-            0);
-    }
+        0);
 }
 
 /*   cl_zplghe_cpu_func - Generate a tile for random hermitian (positive definite if bump is large enough) matrix. */
diff --git a/runtime/starpu/codelets/codelet_zplgsy.c b/runtime/starpu/codelets/codelet_zplgsy.c
index 965ff11d884e566a096d6495bd3c6ebc59682d6b..cbe5f9ee2970b7f924aa46303b167640e3db69bb 100644
--- a/runtime/starpu/codelets/codelet_zplgsy.c
+++ b/runtime/starpu/codelets/codelet_zplgsy.c
@@ -42,26 +42,27 @@ void MORSE_TASK_zplgsy( const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zplgsy;
     void (*callback)(void*) = options->profiling ? cl_zplgsy_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE, &bump,       sizeof(MORSE_Complex64_t),
-            STARPU_VALUE,    &m,                      sizeof(int),
-            STARPU_VALUE,    &n,                      sizeof(int),
-            STARPU_W,         RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,  &lda,                      sizeof(int),
-            STARPU_VALUE, &bigM,                      sizeof(int),
-            STARPU_VALUE,   &m0,                      sizeof(int),
-            STARPU_VALUE,   &n0,                      sizeof(int),
-            STARPU_VALUE, &seed,   sizeof(unsigned long long int),
-            STARPU_PRIORITY,    options->priority,
-            STARPU_CALLBACK,    callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_W(A, Am, An);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE, &bump,       sizeof(MORSE_Complex64_t),
+        STARPU_VALUE,    &m,                      sizeof(int),
+        STARPU_VALUE,    &n,                      sizeof(int),
+        STARPU_W,         RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,  &lda,                      sizeof(int),
+        STARPU_VALUE, &bigM,                      sizeof(int),
+        STARPU_VALUE,   &m0,                      sizeof(int),
+        STARPU_VALUE,   &n0,                      sizeof(int),
+        STARPU_VALUE, &seed,   sizeof(unsigned long long int),
+        STARPU_PRIORITY,    options->priority,
+        STARPU_CALLBACK,    callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zplgsy",
+        STARPU_NAME, "zplgsy",
 #endif
-            0);
-    }
+        0);
 }
 
 /*   cl_zplgsy_cpu_func - Generate a tile for random symmetric (positive definite if 'bump' is large enough) matrix. */
diff --git a/runtime/starpu/codelets/codelet_zplrnt.c b/runtime/starpu/codelets/codelet_zplrnt.c
index 12bd1dfbdfa2c8952d5bef5d64cf630f79b106ec..b8c96b26348d48af715214639e7657d03e22f25b 100644
--- a/runtime/starpu/codelets/codelet_zplrnt.c
+++ b/runtime/starpu/codelets/codelet_zplrnt.c
@@ -41,25 +41,27 @@ void MORSE_TASK_zplrnt( const MORSE_option_t *options,
 
     struct starpu_codelet *codelet = &cl_zplrnt;
     void (*callback)(void*) = options->profiling ? cl_zplrnt_callback : NULL;
-    if ( morse_desc_islocal( A, Am, An ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &m,                      sizeof(int),
-            STARPU_VALUE,    &n,                      sizeof(int),
-            STARPU_W,         RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,  &lda,                      sizeof(int),
-            STARPU_VALUE, &bigM,                      sizeof(int),
-            STARPU_VALUE,   &m0,                      sizeof(int),
-            STARPU_VALUE,   &n0,                      sizeof(int),
-            STARPU_VALUE, &seed,   sizeof(unsigned long long int),
-            STARPU_PRIORITY,    options->priority,
-            STARPU_CALLBACK,    callback,
+
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_W(A, Am, An);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &m,                      sizeof(int),
+        STARPU_VALUE,    &n,                      sizeof(int),
+        STARPU_W,         RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,  &lda,                      sizeof(int),
+        STARPU_VALUE, &bigM,                      sizeof(int),
+        STARPU_VALUE,   &m0,                      sizeof(int),
+        STARPU_VALUE,   &n0,                      sizeof(int),
+        STARPU_VALUE, &seed,   sizeof(unsigned long long int),
+        STARPU_PRIORITY,    options->priority,
+        STARPU_CALLBACK,    callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zplrnt",
+        STARPU_NAME, "zplrnt",
 #endif
-            0);
-    }
+        0);
 }
 
 /*   cl_zplrnt_cpu_func - Generate a tile for random matrix. */
diff --git a/runtime/starpu/codelets/codelet_zplssq.c b/runtime/starpu/codelets/codelet_zplssq.c
index 0c85274d127025756eba7f0dbb917ec760ee53bf..75538476ebfe37346cb37be9276222076acbb106 100644
--- a/runtime/starpu/codelets/codelet_zplssq.c
+++ b/runtime/starpu/codelets/codelet_zplssq.c
@@ -66,20 +66,21 @@ void MORSE_TASK_zplssq( const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zplssq;
     void (*callback)(void*) = options->profiling ? cl_zplssq_callback : NULL;
 
-    if ( morse_desc_islocal( SCALESUMSQ, SCALESUMSQm, SCALESUMSQn ) ||
-         morse_desc_islocal( SCLSSQ,     SCLSSQm,     SCLSSQn ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_R,  RTBLKADDR(SCALESUMSQ, double, SCALESUMSQm, SCALESUMSQn),
-            STARPU_RW, RTBLKADDR(SCLSSQ,     double, SCLSSQm,     SCLSSQn),
-            STARPU_PRIORITY,    options->priority,
-            STARPU_CALLBACK,    callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_R(SCALESUMSQ, SCALESUMSQm, SCALESUMSQn);
+    MORSE_ACCESS_RW(SCLSSQ, SCLSSQm, SCLSSQn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_R,  RTBLKADDR(SCALESUMSQ, double, SCALESUMSQm, SCALESUMSQn),
+        STARPU_RW, RTBLKADDR(SCLSSQ,     double, SCLSSQm,     SCLSSQn),
+        STARPU_PRIORITY,    options->priority,
+        STARPU_CALLBACK,    callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zplssq",
+        STARPU_NAME, "zplssq",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_zpotrf.c b/runtime/starpu/codelets/codelet_zpotrf.c
index 2f5e6cfc984e4021f6c2506aa5b0c386baf98362..857cf3356edda7507b788e90ce56682cdd1f4608 100644
--- a/runtime/starpu/codelets/codelet_zpotrf.c
+++ b/runtime/starpu/codelets/codelet_zpotrf.c
@@ -47,23 +47,24 @@ void MORSE_TASK_zpotrf(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zpotrf;
     void (*callback)(void*) = options->profiling ? cl_zpotrf_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &uplo,                      sizeof(MORSE_enum),
-            STARPU_VALUE,    &n,                         sizeof(int),
-            STARPU_RW,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,    &lda,                       sizeof(int),
-            STARPU_VALUE,    &iinfo,                     sizeof(int),
-            /* STARPU_SCRATCH,   options->ws_worker, */
-            STARPU_PRIORITY,  options->priority,
-            STARPU_CALLBACK,  callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_RW(A, Am, An);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &uplo,                      sizeof(MORSE_enum),
+        STARPU_VALUE,    &n,                         sizeof(int),
+        STARPU_RW,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,    &lda,                       sizeof(int),
+        STARPU_VALUE,    &iinfo,                     sizeof(int),
+        /* STARPU_SCRATCH,   options->ws_worker, */
+        STARPU_PRIORITY,  options->priority,
+        STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zpotrf",
+        STARPU_NAME, "zpotrf",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_zssssm.c b/runtime/starpu/codelets/codelet_zssssm.c
index 20dfcd9da62fa92a5faa445b4704d768cbd64449..a1fae08bb05f5eb552ea5a2492b543009b294a71 100644
--- a/runtime/starpu/codelets/codelet_zssssm.c
+++ b/runtime/starpu/codelets/codelet_zssssm.c
@@ -115,35 +115,36 @@ void MORSE_TASK_zssssm(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zssssm;
     void (*callback)(void*) = options->profiling ? cl_zssssm_callback : NULL;
 
-    if ( morse_desc_islocal( A1, A1m, A1n ) ||
-         morse_desc_islocal( A2, A2m, A2n ) ||
-         morse_desc_islocal( L1, L1m, L1n ) ||
-         morse_desc_islocal( L2, L2m, L2n ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &m1,                        sizeof(int),
-            STARPU_VALUE,    &n1,                        sizeof(int),
-            STARPU_VALUE,    &m2,                        sizeof(int),
-            STARPU_VALUE,    &n2,                        sizeof(int),
-            STARPU_VALUE,     &k,                        sizeof(int),
-            STARPU_VALUE,    &ib,                        sizeof(int),
-            STARPU_RW,            RTBLKADDR(A1, MORSE_Complex64_t, A1m, A1n),
-            STARPU_VALUE,  &lda1,                        sizeof(int),
-            STARPU_RW,            RTBLKADDR(A2, MORSE_Complex64_t, A2m, A2n),
-            STARPU_VALUE,  &lda2,                        sizeof(int),
-            STARPU_R,             RTBLKADDR(L1, MORSE_Complex64_t, L1m, L1n),
-            STARPU_VALUE,  &ldl1,                        sizeof(int),
-            STARPU_R,             RTBLKADDR(L2, MORSE_Complex64_t, L2m, L2n),
-            STARPU_VALUE,  &ldl2,                        sizeof(int),
-            STARPU_VALUE,          &IPIV,                      sizeof(int*),
-            STARPU_PRIORITY,    options->priority,
-            STARPU_CALLBACK,    callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_RW(A1, A1m, A1n);
+    MORSE_ACCESS_RW(A2, A2m, A2n);
+    MORSE_ACCESS_R(L1, L1m, L1n);
+    MORSE_ACCESS_R(L2, L2m, L2n);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &m1,                        sizeof(int),
+        STARPU_VALUE,    &n1,                        sizeof(int),
+        STARPU_VALUE,    &m2,                        sizeof(int),
+        STARPU_VALUE,    &n2,                        sizeof(int),
+        STARPU_VALUE,     &k,                        sizeof(int),
+        STARPU_VALUE,    &ib,                        sizeof(int),
+        STARPU_RW,            RTBLKADDR(A1, MORSE_Complex64_t, A1m, A1n),
+        STARPU_VALUE,  &lda1,                        sizeof(int),
+        STARPU_RW,            RTBLKADDR(A2, MORSE_Complex64_t, A2m, A2n),
+        STARPU_VALUE,  &lda2,                        sizeof(int),
+        STARPU_R,             RTBLKADDR(L1, MORSE_Complex64_t, L1m, L1n),
+        STARPU_VALUE,  &ldl1,                        sizeof(int),
+        STARPU_R,             RTBLKADDR(L2, MORSE_Complex64_t, L2m, L2n),
+        STARPU_VALUE,  &ldl2,                        sizeof(int),
+        STARPU_VALUE,          &IPIV,                      sizeof(int*),
+        STARPU_PRIORITY,    options->priority,
+        STARPU_CALLBACK,    callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zssssm",
+        STARPU_NAME, "zssssm",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_zsymm.c b/runtime/starpu/codelets/codelet_zsymm.c
index 78ad94c01ba60bd5c65981017bb4185e7ecd577d..71e6b86700dde96065d72c0a0c3e43edac347f2c 100644
--- a/runtime/starpu/codelets/codelet_zsymm.c
+++ b/runtime/starpu/codelets/codelet_zsymm.c
@@ -48,31 +48,32 @@ void MORSE_TASK_zsymm(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zsymm;
     void (*callback)(void*) = options->profiling ? cl_zsymm_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) ||
-         morse_desc_islocal( B, Bm, Bn ) ||
-         morse_desc_islocal( C, Cm, Cn ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &side,                sizeof(MORSE_enum),
-            STARPU_VALUE,    &uplo,                sizeof(MORSE_enum),
-            STARPU_VALUE,       &m,                        sizeof(int),
-            STARPU_VALUE,       &n,                        sizeof(int),
-            STARPU_VALUE,   &alpha,         sizeof(MORSE_Complex64_t),
-            STARPU_R,               RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,     &lda,                        sizeof(int),
-            STARPU_R,               RTBLKADDR(B, MORSE_Complex64_t, Bm, Bn),
-            STARPU_VALUE,     &ldb,                        sizeof(int),
-            STARPU_VALUE,    &beta,         sizeof(MORSE_Complex64_t),
-            STARPU_RW,               RTBLKADDR(C, MORSE_Complex64_t, Cm, Cn),
-            STARPU_VALUE,     &ldc,                        sizeof(int),
-            STARPU_PRIORITY,    options->priority,
-            STARPU_CALLBACK,    callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_R(A, Am, An);
+    MORSE_ACCESS_R(B, Bm, Bn);
+    MORSE_ACCESS_RW(C, Cm, Cn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &side,                sizeof(MORSE_enum),
+        STARPU_VALUE,    &uplo,                sizeof(MORSE_enum),
+        STARPU_VALUE,       &m,                        sizeof(int),
+        STARPU_VALUE,       &n,                        sizeof(int),
+        STARPU_VALUE,   &alpha,         sizeof(MORSE_Complex64_t),
+        STARPU_R,               RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,     &lda,                        sizeof(int),
+        STARPU_R,               RTBLKADDR(B, MORSE_Complex64_t, Bm, Bn),
+        STARPU_VALUE,     &ldb,                        sizeof(int),
+        STARPU_VALUE,    &beta,         sizeof(MORSE_Complex64_t),
+        STARPU_RW,               RTBLKADDR(C, MORSE_Complex64_t, Cm, Cn),
+        STARPU_VALUE,     &ldc,                        sizeof(int),
+        STARPU_PRIORITY,    options->priority,
+        STARPU_CALLBACK,    callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zsymm",
+        STARPU_NAME, "zsymm",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_zsyr2k.c b/runtime/starpu/codelets/codelet_zsyr2k.c
index d2a59d995c18b9d854ceb989f0d0e713f2879cf0..cafe3887e071c926e91f296b79d97210eaf71c15 100644
--- a/runtime/starpu/codelets/codelet_zsyr2k.c
+++ b/runtime/starpu/codelets/codelet_zsyr2k.c
@@ -48,31 +48,32 @@ void MORSE_TASK_zsyr2k(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zsyr2k;
     void (*callback)(void*) = options->profiling ? cl_zsyr2k_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) ||
-         morse_desc_islocal( B, Bm, Bn ) ||
-         morse_desc_islocal( C, Cm, Cn ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,      &uplo,                sizeof(MORSE_enum),
-            STARPU_VALUE,     &trans,                sizeof(MORSE_enum),
-            STARPU_VALUE,         &n,                        sizeof(int),
-            STARPU_VALUE,         &k,                        sizeof(int),
-            STARPU_VALUE,     &alpha,         sizeof(MORSE_Complex64_t),
-            STARPU_R,                 RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,       &lda,                        sizeof(int),
-            STARPU_R,                 RTBLKADDR(B, MORSE_Complex64_t, Bm, Bn),
-            STARPU_VALUE,       &ldb,                        sizeof(int),
-            STARPU_VALUE,      &beta,         sizeof(MORSE_Complex64_t),
-            STARPU_RW,                 RTBLKADDR(C, MORSE_Complex64_t, Cm, Cn),
-            STARPU_VALUE,       &ldc,                        sizeof(int),
-            STARPU_PRIORITY,    options->priority,
-            STARPU_CALLBACK,    callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_R(A, Am, An);
+    MORSE_ACCESS_R(B, Bm, Bn);
+    MORSE_ACCESS_RW(C, Cm, Cn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,      &uplo,                sizeof(MORSE_enum),
+        STARPU_VALUE,     &trans,                sizeof(MORSE_enum),
+        STARPU_VALUE,         &n,                        sizeof(int),
+        STARPU_VALUE,         &k,                        sizeof(int),
+        STARPU_VALUE,     &alpha,         sizeof(MORSE_Complex64_t),
+        STARPU_R,                 RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,       &lda,                        sizeof(int),
+        STARPU_R,                 RTBLKADDR(B, MORSE_Complex64_t, Bm, Bn),
+        STARPU_VALUE,       &ldb,                        sizeof(int),
+        STARPU_VALUE,      &beta,         sizeof(MORSE_Complex64_t),
+        STARPU_RW,                 RTBLKADDR(C, MORSE_Complex64_t, Cm, Cn),
+        STARPU_VALUE,       &ldc,                        sizeof(int),
+        STARPU_PRIORITY,    options->priority,
+        STARPU_CALLBACK,    callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zsyr2k",
+        STARPU_NAME, "zsyr2k",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_zsyrk.c b/runtime/starpu/codelets/codelet_zsyrk.c
index c38981ef4a49b300d3bc16a6f00dd3f20d56f6ad..b368779f50cc7af2dcb8644be56720746a4deb37 100644
--- a/runtime/starpu/codelets/codelet_zsyrk.c
+++ b/runtime/starpu/codelets/codelet_zsyrk.c
@@ -47,28 +47,29 @@ void MORSE_TASK_zsyrk(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zsyrk;
     void (*callback)(void*) = options->profiling ? cl_zsyrk_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) ||
-         morse_desc_islocal( C, Cm, Cn ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,      &uplo,                sizeof(MORSE_enum),
-            STARPU_VALUE,     &trans,                sizeof(MORSE_enum),
-            STARPU_VALUE,         &n,                        sizeof(int),
-            STARPU_VALUE,         &k,                        sizeof(int),
-            STARPU_VALUE,     &alpha,         sizeof(MORSE_Complex64_t),
-            STARPU_R,                 RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,       &lda,                        sizeof(int),
-            STARPU_VALUE,      &beta,         sizeof(MORSE_Complex64_t),
-            STARPU_RW,                 RTBLKADDR(C, MORSE_Complex64_t, Cm, Cn),
-            STARPU_VALUE,       &ldc,                        sizeof(int),
-            STARPU_PRIORITY,    options->priority,
-            STARPU_CALLBACK,    callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_R(A, Am, An);
+    MORSE_ACCESS_RW(C, Cm, Cn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,      &uplo,                sizeof(MORSE_enum),
+        STARPU_VALUE,     &trans,                sizeof(MORSE_enum),
+        STARPU_VALUE,         &n,                        sizeof(int),
+        STARPU_VALUE,         &k,                        sizeof(int),
+        STARPU_VALUE,     &alpha,         sizeof(MORSE_Complex64_t),
+        STARPU_R,                 RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,       &lda,                        sizeof(int),
+        STARPU_VALUE,      &beta,         sizeof(MORSE_Complex64_t),
+        STARPU_RW,                 RTBLKADDR(C, MORSE_Complex64_t, Cm, Cn),
+        STARPU_VALUE,       &ldc,                        sizeof(int),
+        STARPU_PRIORITY,    options->priority,
+        STARPU_CALLBACK,    callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zsyrk",
+        STARPU_NAME, "zsyrk",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_zsyssq.c b/runtime/starpu/codelets/codelet_zsyssq.c
index 7335678bddfc08d70a921a71fa00218aa8233253..882650f2865138f4d3e804631de879e1add16b04 100644
--- a/runtime/starpu/codelets/codelet_zsyssq.c
+++ b/runtime/starpu/codelets/codelet_zsyssq.c
@@ -34,23 +34,25 @@ void MORSE_TASK_zsyssq( const MORSE_option_t *options,
 {
     struct starpu_codelet *codelet = &cl_zsyssq;
     void (*callback)(void*) = options->profiling ? cl_zgessq_callback : NULL;
-    if ( morse_desc_islocal( A, Am, An ) ||
-         morse_desc_islocal( SCALESUMSQ, SCALESUMSQm, SCALESUMSQn ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &uplo,                       sizeof(MORSE_enum),
-            STARPU_VALUE,    &n,                          sizeof(int),
-            STARPU_R,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,    &lda,                        sizeof(int),
-            STARPU_RW,       RTBLKADDR(SCALESUMSQ, double, SCALESUMSQm, SCALESUMSQn),
-            STARPU_PRIORITY, options->priority,
-            STARPU_CALLBACK, callback,
+
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_R(A, Am, An);
+    MORSE_ACCESS_RW(SCALESUMSQ, SCALESUMSQm, SCALESUMSQn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &uplo,                       sizeof(MORSE_enum),
+        STARPU_VALUE,    &n,                          sizeof(int),
+        STARPU_R,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,    &lda,                        sizeof(int),
+        STARPU_RW,       RTBLKADDR(SCALESUMSQ, double, SCALESUMSQm, SCALESUMSQn),
+        STARPU_PRIORITY, options->priority,
+        STARPU_CALLBACK, callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zsyssq",
+        STARPU_NAME, "zsyssq",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_zsytrf_nopiv.c b/runtime/starpu/codelets/codelet_zsytrf_nopiv.c
index a1592b9aa3d44d6f968debea2e54c6d960e93cb5..002591071b3b5a7509b9e4941732a264bfc1aaed 100644
--- a/runtime/starpu/codelets/codelet_zsytrf_nopiv.c
+++ b/runtime/starpu/codelets/codelet_zsytrf_nopiv.c
@@ -41,23 +41,24 @@ void MORSE_TASK_zsytrf_nopiv(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zsytrf_nopiv;
     void (*callback)(void*) = options->profiling ? cl_zsytrf_nopiv_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &uplo,                      sizeof(MORSE_enum),
-            STARPU_VALUE,    &n,                         sizeof(int),
-            STARPU_RW,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,    &lda,                       sizeof(int),
-            STARPU_VALUE,    &iinfo,                     sizeof(int),
-            /* STARPU_SCRATCH,   options->ws_worker, */
-            STARPU_PRIORITY,  options->priority,
-            STARPU_CALLBACK,  callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_RW(A, Am, An);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &uplo,                      sizeof(MORSE_enum),
+        STARPU_VALUE,    &n,                         sizeof(int),
+        STARPU_RW,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,    &lda,                       sizeof(int),
+        STARPU_VALUE,    &iinfo,                     sizeof(int),
+        /* STARPU_SCRATCH,   options->ws_worker, */
+        STARPU_PRIORITY,  options->priority,
+        STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zsytrf_nopiv",
+        STARPU_NAME, "zsytrf_nopiv",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_ztile_zero.c b/runtime/starpu/codelets/codelet_ztile_zero.c
index 553729e36cf47cea9916bd6153d30ea29f90f559..b07702888352d4402837a23c8f63a15fc74eeeaf 100644
--- a/runtime/starpu/codelets/codelet_ztile_zero.c
+++ b/runtime/starpu/codelets/codelet_ztile_zero.c
@@ -38,23 +38,24 @@ void MORSE_TASK_ztile_zero(const const MORSE_option_t *options,
     codelet = &cl_ztile_zero;
     void (*callback)(void*) = options->profiling ? cl_zlacpy_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE, &X1,  sizeof(int),
-            STARPU_VALUE, &X2,  sizeof(int),
-            STARPU_VALUE, &Y1,  sizeof(int),
-            STARPU_VALUE, &Y2,  sizeof(int),
-            STARPU_RW,     RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE, &lda, sizeof(int),
-            STARPU_PRIORITY,    options->priority,
-            STARPU_CALLBACK,    callback, NULL,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_W(A, Am, An);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE, &X1,  sizeof(int),
+        STARPU_VALUE, &X2,  sizeof(int),
+        STARPU_VALUE, &Y1,  sizeof(int),
+        STARPU_VALUE, &Y2,  sizeof(int),
+        STARPU_W,     RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE, &lda, sizeof(int),
+        STARPU_PRIORITY,    options->priority,
+        STARPU_CALLBACK,    callback, NULL,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "ztile_zero",
+        STARPU_NAME, "ztile_zero",
 #endif
-            0);
-    }
+        0);
 }
 
 /*****************************************************************************
diff --git a/runtime/starpu/codelets/codelet_ztpmqrt.c b/runtime/starpu/codelets/codelet_ztpmqrt.c
index e1743543e701b43c6a81372c97aae60db1b6154e..5428c9eea8badfdc586898350e80af94497a2f6a 100644
--- a/runtime/starpu/codelets/codelet_ztpmqrt.c
+++ b/runtime/starpu/codelets/codelet_ztpmqrt.c
@@ -36,37 +36,38 @@ void MORSE_TASK_ztpmqrt( const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_ztpmqrt;
     void (*callback)(void*) = options->profiling ? cl_ztpmqrt_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) ||
-         morse_desc_islocal( B, Bm, Bn ) ||
-         morse_desc_islocal( V, Vm, Vn ) ||
-         morse_desc_islocal( T, Tm, Tn ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE, &side,  sizeof(MORSE_enum),
-            STARPU_VALUE, &trans, sizeof(MORSE_enum),
-            STARPU_VALUE, &M,     sizeof(int),
-            STARPU_VALUE, &N,     sizeof(int),
-            STARPU_VALUE, &K,     sizeof(int),
-            STARPU_VALUE, &L,     sizeof(int),
-            STARPU_VALUE, &ib,     sizeof(int),
-            STARPU_R,      RTBLKADDR(V, MORSE_Complex64_t, Vm, Vn),
-            STARPU_VALUE, &ldv,   sizeof(int),
-            STARPU_R,      RTBLKADDR(T, MORSE_Complex64_t, Tm, Tn),
-            STARPU_VALUE, &ldt,   sizeof(int),
-            STARPU_RW,     RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE, &lda,   sizeof(int),
-            STARPU_RW,     RTBLKADDR(B, MORSE_Complex64_t, Bm, Bn),
-            STARPU_VALUE, &ldb,   sizeof(int),
-            /* Other options */
-            STARPU_SCRATCH,   options->ws_worker,
-            STARPU_PRIORITY,  options->priority,
-            STARPU_CALLBACK,  callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_R(V, Vm, Vn);
+    MORSE_ACCESS_R(T, Tm, Tn);
+    MORSE_ACCESS_RW(A, Am, An);
+    MORSE_ACCESS_RW(B, Bm, Bn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE, &side,  sizeof(MORSE_enum),
+        STARPU_VALUE, &trans, sizeof(MORSE_enum),
+        STARPU_VALUE, &M,     sizeof(int),
+        STARPU_VALUE, &N,     sizeof(int),
+        STARPU_VALUE, &K,     sizeof(int),
+        STARPU_VALUE, &L,     sizeof(int),
+        STARPU_VALUE, &ib,     sizeof(int),
+        STARPU_R,      RTBLKADDR(V, MORSE_Complex64_t, Vm, Vn),
+        STARPU_VALUE, &ldv,   sizeof(int),
+        STARPU_R,      RTBLKADDR(T, MORSE_Complex64_t, Tm, Tn),
+        STARPU_VALUE, &ldt,   sizeof(int),
+        STARPU_RW,     RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE, &lda,   sizeof(int),
+        STARPU_RW,     RTBLKADDR(B, MORSE_Complex64_t, Bm, Bn),
+        STARPU_VALUE, &ldb,   sizeof(int),
+        /* Other options */
+        STARPU_SCRATCH,   options->ws_worker,
+        STARPU_PRIORITY,  options->priority,
+        STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "ztpmqrt",
+        STARPU_NAME, "ztpmqrt",
 #endif
-            0);
-    }
+        0);
 
     (void)ib; (void)nb;
 }
diff --git a/runtime/starpu/codelets/codelet_ztpqrt.c b/runtime/starpu/codelets/codelet_ztpqrt.c
index bda639581a0dd6a1474be055ba4b038efa04137a..893a3ec9735607828e41d8c9186a1c5134b916c9 100644
--- a/runtime/starpu/codelets/codelet_ztpqrt.c
+++ b/runtime/starpu/codelets/codelet_ztpqrt.c
@@ -34,31 +34,32 @@ void MORSE_TASK_ztpqrt( const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_ztpqrt;
     void (*callback)(void*) = options->profiling ? cl_ztpqrt_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) ||
-         morse_desc_islocal( B, Bm, Bn ) ||
-         morse_desc_islocal( T, Tm, Tn ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE, &M,     sizeof(int),
-            STARPU_VALUE, &N,     sizeof(int),
-            STARPU_VALUE, &L,     sizeof(int),
-            STARPU_VALUE, &ib,    sizeof(int),
-            STARPU_RW,     RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE, &lda,   sizeof(int),
-            STARPU_RW,     RTBLKADDR(B, MORSE_Complex64_t, Bm, Bn),
-            STARPU_VALUE, &ldb,   sizeof(int),
-            STARPU_RW,     RTBLKADDR(T, MORSE_Complex64_t, Tm, Tn),
-            STARPU_VALUE, &ldt,   sizeof(int),
-            /* Other options */
-            STARPU_SCRATCH,   options->ws_worker,
-            STARPU_PRIORITY,  options->priority,
-            STARPU_CALLBACK,  callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_RW(A, Am, An);
+    MORSE_ACCESS_RW(B, Bm, Bn);
+    MORSE_ACCESS_W(T, Tm, Tn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE, &M,     sizeof(int),
+        STARPU_VALUE, &N,     sizeof(int),
+        STARPU_VALUE, &L,     sizeof(int),
+        STARPU_VALUE, &ib,    sizeof(int),
+        STARPU_RW,     RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE, &lda,   sizeof(int),
+        STARPU_RW,     RTBLKADDR(B, MORSE_Complex64_t, Bm, Bn),
+        STARPU_VALUE, &ldb,   sizeof(int),
+        STARPU_W,      RTBLKADDR(T, MORSE_Complex64_t, Tm, Tn),
+        STARPU_VALUE, &ldt,   sizeof(int),
+        /* Other options */
+        STARPU_SCRATCH,   options->ws_worker,
+        STARPU_PRIORITY,  options->priority,
+        STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "ztpqrt",
+        STARPU_NAME, "ztpqrt",
 #endif
-            0);
-    }
+        0);
 
     (void)ib; (void)nb;
 }
diff --git a/runtime/starpu/codelets/codelet_ztradd.c b/runtime/starpu/codelets/codelet_ztradd.c
index 9147e25affaa5222547338aec3fc03f8ae3ca6b8..ffce0ea3f581a58470f5b01a16f682d898bb7ee7 100644
--- a/runtime/starpu/codelets/codelet_ztradd.c
+++ b/runtime/starpu/codelets/codelet_ztradd.c
@@ -95,28 +95,29 @@ void MORSE_TASK_ztradd(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_ztradd;
     void (*callback)(void*) = options->profiling ? cl_zgeadd_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) ||
-	 morse_desc_islocal( B, Bm, Bn ) )
-    {
-	starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &uplo,               sizeof(MORSE_enum),
-            STARPU_VALUE,    &trans,              sizeof(MORSE_enum),
-            STARPU_VALUE,    &m,                  sizeof(int),
-            STARPU_VALUE,    &n,                  sizeof(int),
-            STARPU_VALUE,    &alpha,              sizeof(MORSE_Complex64_t),
-            STARPU_R,         RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,    &lda,                sizeof(int),
-            STARPU_VALUE,    &beta,               sizeof(MORSE_Complex64_t),
-            STARPU_RW,        RTBLKADDR(B, MORSE_Complex64_t, Bm, Bn),
-            STARPU_VALUE,    &ldb,                sizeof(int),
-            STARPU_PRIORITY,  options->priority,
-            STARPU_CALLBACK,  callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_R(A, Am, An);
+    MORSE_ACCESS_RW(B, Bm, Bn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &uplo,               sizeof(MORSE_enum),
+        STARPU_VALUE,    &trans,              sizeof(MORSE_enum),
+        STARPU_VALUE,    &m,                  sizeof(int),
+        STARPU_VALUE,    &n,                  sizeof(int),
+        STARPU_VALUE,    &alpha,              sizeof(MORSE_Complex64_t),
+        STARPU_R,         RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,    &lda,                sizeof(int),
+        STARPU_VALUE,    &beta,               sizeof(MORSE_Complex64_t),
+        STARPU_RW,        RTBLKADDR(B, MORSE_Complex64_t, Bm, Bn),
+        STARPU_VALUE,    &ldb,                sizeof(int),
+        STARPU_PRIORITY,  options->priority,
+        STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "ztradd",
+        STARPU_NAME, "ztradd",
 #endif
-            0);
-    }
+        0);
 
     (void)nb;
 }
diff --git a/runtime/starpu/codelets/codelet_ztrasm.c b/runtime/starpu/codelets/codelet_ztrasm.c
index 859e2688837be2d4ccb1cd8ea89675f71fdf20e2..03e30ff6c330c3b07ee93f1981af345b610d46f0 100644
--- a/runtime/starpu/codelets/codelet_ztrasm.c
+++ b/runtime/starpu/codelets/codelet_ztrasm.c
@@ -34,6 +34,12 @@ void MORSE_TASK_ztrasm(const MORSE_option_t *options,
 {
     struct starpu_codelet *codelet = &cl_ztrasm;
     void (*callback)(void*) = options->profiling ? cl_ztrasm_callback : NULL;
+
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_R(A, Am, An);
+    MORSE_ACCESS_RW(B, Bm, Bn);
+    MORSE_END_ACCESS_DECLARATION;
+
     starpu_insert_task(
         starpu_mpi_codelet(codelet),
         STARPU_VALUE,    &storev,                    sizeof(MORSE_enum),
diff --git a/runtime/starpu/codelets/codelet_ztrmm.c b/runtime/starpu/codelets/codelet_ztrmm.c
index 0072d1f24f34fac62ccf1fa6cf03876e3fa520e2..ca54848703d4778361831948aaebfff235795779 100644
--- a/runtime/starpu/codelets/codelet_ztrmm.c
+++ b/runtime/starpu/codelets/codelet_ztrmm.c
@@ -47,29 +47,30 @@ void MORSE_TASK_ztrmm(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_ztrmm;
     void (*callback)(void*) = options->profiling ? cl_ztrmm_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) ||
-         morse_desc_islocal( B, Bm, Bn ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,      &side,                sizeof(MORSE_enum),
-            STARPU_VALUE,      &uplo,                sizeof(MORSE_enum),
-            STARPU_VALUE,    &transA,                sizeof(MORSE_enum),
-            STARPU_VALUE,      &diag,                sizeof(MORSE_enum),
-            STARPU_VALUE,         &m,                        sizeof(int),
-            STARPU_VALUE,         &n,                        sizeof(int),
-            STARPU_VALUE,     &alpha,         sizeof(MORSE_Complex64_t),
-            STARPU_R,                 RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,       &lda,                        sizeof(int),
-            STARPU_RW,                 RTBLKADDR(B, MORSE_Complex64_t, Bm, Bn),
-            STARPU_VALUE,       &ldb,                        sizeof(int),
-            STARPU_PRIORITY,    options->priority,
-            STARPU_CALLBACK,    callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_R(A, Am, An);
+    MORSE_ACCESS_RW(B, Bm, Bn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,      &side,                sizeof(MORSE_enum),
+        STARPU_VALUE,      &uplo,                sizeof(MORSE_enum),
+        STARPU_VALUE,    &transA,                sizeof(MORSE_enum),
+        STARPU_VALUE,      &diag,                sizeof(MORSE_enum),
+        STARPU_VALUE,         &m,                        sizeof(int),
+        STARPU_VALUE,         &n,                        sizeof(int),
+        STARPU_VALUE,     &alpha,         sizeof(MORSE_Complex64_t),
+        STARPU_R,                 RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,       &lda,                        sizeof(int),
+        STARPU_RW,                 RTBLKADDR(B, MORSE_Complex64_t, Bm, Bn),
+        STARPU_VALUE,       &ldb,                        sizeof(int),
+        STARPU_PRIORITY,    options->priority,
+        STARPU_CALLBACK,    callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "ztrmm",
+        STARPU_NAME, "ztrmm",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_ztrsm.c b/runtime/starpu/codelets/codelet_ztrsm.c
index dbed609debc3c2688ac937a5f6cb5b3f49f9f027..061c264121b27baf69d7906300551697302f4fba 100644
--- a/runtime/starpu/codelets/codelet_ztrsm.c
+++ b/runtime/starpu/codelets/codelet_ztrsm.c
@@ -64,34 +64,35 @@ void MORSE_TASK_ztrsm(const MORSE_option_t *options,
         rank_changed=1;
     }
 
-    if ( morse_desc_islocal( A, Am, An ) ||
-         morse_desc_islocal( B, Bm, Bn ) ||
-         rank_changed
-       )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &side,               sizeof(MORSE_enum),
-            STARPU_VALUE,    &uplo,               sizeof(MORSE_enum),
-            STARPU_VALUE,    &transA,             sizeof(MORSE_enum),
-            STARPU_VALUE,    &diag,               sizeof(MORSE_enum),
-            STARPU_VALUE,    &m,                  sizeof(int),
-            STARPU_VALUE,    &n,                  sizeof(int),
-            STARPU_VALUE,    &alpha,              sizeof(MORSE_Complex64_t),
-            STARPU_R,         RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,    &lda,                sizeof(int),
-            STARPU_RW,        RTBLKADDR(B, MORSE_Complex64_t, Bm, Bn),
-            STARPU_VALUE,    &ldb,                sizeof(int),
-            STARPU_PRIORITY,  options->priority,
-            STARPU_CALLBACK,  callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_R(A, Am, An);
+    MORSE_ACCESS_RW(B, Bm, Bn);
+    if (rank_changed)
+        MORSE_RANK_CHANGED;
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &side,               sizeof(MORSE_enum),
+        STARPU_VALUE,    &uplo,               sizeof(MORSE_enum),
+        STARPU_VALUE,    &transA,             sizeof(MORSE_enum),
+        STARPU_VALUE,    &diag,               sizeof(MORSE_enum),
+        STARPU_VALUE,    &m,                  sizeof(int),
+        STARPU_VALUE,    &n,                  sizeof(int),
+        STARPU_VALUE,    &alpha,              sizeof(MORSE_Complex64_t),
+        STARPU_R,         RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,    &lda,                sizeof(int),
+        STARPU_RW,        RTBLKADDR(B, MORSE_Complex64_t, Bm, Bn),
+        STARPU_VALUE,    &ldb,                sizeof(int),
+        STARPU_PRIORITY,  options->priority,
+        STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_USE_MPI)
-            STARPU_EXECUTE_ON_NODE, execution_rank,
+        STARPU_EXECUTE_ON_NODE, execution_rank,
 #endif
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "ztrsm",
+        STARPU_NAME, "ztrsm",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_ztrssq.c b/runtime/starpu/codelets/codelet_ztrssq.c
index ce875156976c82406e31e86814e9b36fd6caa736..578b318cee6174de50647efb18a59963e14dc40b 100644
--- a/runtime/starpu/codelets/codelet_ztrssq.c
+++ b/runtime/starpu/codelets/codelet_ztrssq.c
@@ -35,25 +35,27 @@ void MORSE_TASK_ztrssq( const MORSE_option_t *options,
 {
     struct starpu_codelet *codelet = &cl_ztrssq;
     void (*callback)(void*) = options->profiling ? cl_ztrasm_callback : NULL;
-    if ( morse_desc_islocal( A, Am, An ) ||
-         morse_desc_islocal( SCALESUMSQ, SCALESUMSQm, SCALESUMSQn ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &uplo,                      sizeof(MORSE_enum),
-            STARPU_VALUE,    &diag,                      sizeof(MORSE_enum),
-            STARPU_VALUE,    &m,                         sizeof(int),
-            STARPU_VALUE,    &n,                         sizeof(int),
-            STARPU_R,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,    &lda,                       sizeof(int),
-            STARPU_RW,       RTBLKADDR(SCALESUMSQ, double, SCALESUMSQm, SCALESUMSQn),
-            STARPU_PRIORITY, options->priority,
-            STARPU_CALLBACK, callback,
+
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_R(A, Am, An);
+    MORSE_ACCESS_RW(SCALESUMSQ, SCALESUMSQm, SCALESUMSQn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &uplo,                      sizeof(MORSE_enum),
+        STARPU_VALUE,    &diag,                      sizeof(MORSE_enum),
+        STARPU_VALUE,    &m,                         sizeof(int),
+        STARPU_VALUE,    &n,                         sizeof(int),
+        STARPU_R,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,    &lda,                       sizeof(int),
+        STARPU_RW,       RTBLKADDR(SCALESUMSQ, double, SCALESUMSQm, SCALESUMSQn),
+        STARPU_PRIORITY, options->priority,
+        STARPU_CALLBACK, callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "ztrssq",
+        STARPU_NAME, "ztrssq",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_ztrtri.c b/runtime/starpu/codelets/codelet_ztrtri.c
index 4d4b8a23c03f9aa73551bb4407a98c838409bdbd..1f619cd097dbd1a75dbdc1f6f6b9d606ef3020be 100644
--- a/runtime/starpu/codelets/codelet_ztrtri.c
+++ b/runtime/starpu/codelets/codelet_ztrtri.c
@@ -48,23 +48,24 @@ void MORSE_TASK_ztrtri(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_ztrtri;
     void (*callback)(void*) = options->profiling ? cl_ztrtri_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &uplo,              sizeof(MORSE_enum),
-            STARPU_VALUE,    &diag,              sizeof(MORSE_enum),
-            STARPU_VALUE,    &n,                 sizeof(int),
-            STARPU_RW,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,    &lda,               sizeof(int),
-            STARPU_VALUE,    &iinfo,             sizeof(int),
-            STARPU_PRIORITY,  options->priority,
-            STARPU_CALLBACK,  callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_RW(A, Am, An);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &uplo,              sizeof(MORSE_enum),
+        STARPU_VALUE,    &diag,              sizeof(MORSE_enum),
+        STARPU_VALUE,    &n,                 sizeof(int),
+        STARPU_RW,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,    &lda,               sizeof(int),
+        STARPU_VALUE,    &iinfo,             sizeof(int),
+        STARPU_PRIORITY,  options->priority,
+        STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "ztrtri",
+        STARPU_NAME, "ztrtri",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_ztslqt.c b/runtime/starpu/codelets/codelet_ztslqt.c
index 04c75182b0010da72689f834c8c783d20a1db5b9..3780308276014e3c7596a79b65d1e32e01df2466 100644
--- a/runtime/starpu/codelets/codelet_ztslqt.c
+++ b/runtime/starpu/codelets/codelet_ztslqt.c
@@ -119,32 +119,33 @@ void MORSE_TASK_ztslqt(const MORSE_option_t *options,
     void (*callback)(void*) = options->profiling ? cl_ztslqt_callback : NULL;
     MORSE_starpu_ws_t *h_work = (MORSE_starpu_ws_t*)(options->ws_host);
 
-    if ( morse_desc_islocal( A1, A1m, A1n ) ||
-         morse_desc_islocal( A2, A2m, A2n ) ||
-         morse_desc_islocal( T,  Tm,  Tn  ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &m,                 sizeof(int),
-            STARPU_VALUE,    &n,                 sizeof(int),
-            STARPU_VALUE,    &ib,                sizeof(int),
-            STARPU_RW,        RTBLKADDR(A1, MORSE_Complex64_t, A1m, A1n),
-            STARPU_VALUE,    &lda1,              sizeof(int),
-            STARPU_RW,        RTBLKADDR(A2, MORSE_Complex64_t, A2m, A2n),
-            STARPU_VALUE,    &lda2,              sizeof(int),
-            STARPU_W,         RTBLKADDR(T, MORSE_Complex64_t, Tm, Tn),
-            STARPU_VALUE,    &ldt,               sizeof(int),
-            /* max( nb * (ib+1), ib * (ib+nb) ) */
-            STARPU_SCRATCH,   options->ws_worker,
-            /* /\* 2 * ib * (nb+ib) + nb *\/ */
-            STARPU_VALUE,    &h_work,            sizeof(MORSE_starpu_ws_t *),
-            STARPU_PRIORITY,  options->priority,
-            STARPU_CALLBACK,  callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_RW(A1, A1m, A1n);
+    MORSE_ACCESS_RW(A2, A2m, A2n);
+    MORSE_ACCESS_W(T, Tm, Tn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &m,                 sizeof(int),
+        STARPU_VALUE,    &n,                 sizeof(int),
+        STARPU_VALUE,    &ib,                sizeof(int),
+        STARPU_RW,        RTBLKADDR(A1, MORSE_Complex64_t, A1m, A1n),
+        STARPU_VALUE,    &lda1,              sizeof(int),
+        STARPU_RW,        RTBLKADDR(A2, MORSE_Complex64_t, A2m, A2n),
+        STARPU_VALUE,    &lda2,              sizeof(int),
+        STARPU_W,         RTBLKADDR(T, MORSE_Complex64_t, Tm, Tn),
+        STARPU_VALUE,    &ldt,               sizeof(int),
+        /* max( nb * (ib+1), ib * (ib+nb) ) */
+        STARPU_SCRATCH,   options->ws_worker,
+        /* /\* 2 * ib * (nb+ib) + nb *\/ */
+        STARPU_VALUE,    &h_work,            sizeof(MORSE_starpu_ws_t *),
+        STARPU_PRIORITY,  options->priority,
+        STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "ztslqt",
+        STARPU_NAME, "ztslqt",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_ztsmlq.c b/runtime/starpu/codelets/codelet_ztsmlq.c
index 62fa28f927f7f03ac47ebbeba1a6fd1d8c925b35..3901295404dcd256073c9e34fa72bcbd2d4dfce0 100644
--- a/runtime/starpu/codelets/codelet_ztsmlq.c
+++ b/runtime/starpu/codelets/codelet_ztsmlq.c
@@ -145,39 +145,40 @@ void MORSE_TASK_ztsmlq(const MORSE_option_t *options,
     void (*callback)(void*) = options->profiling ? cl_ztsmlq_callback : NULL;
     int ldwork = side == MorseLeft ? ib : nb;
 
-    if ( morse_desc_islocal( A1, A1m, A1n ) ||
-         morse_desc_islocal( A2, A2m, A2n ) ||
-         morse_desc_islocal( V,  Vm,  Vn  ) ||
-         morse_desc_islocal( T,  Tm,  Tn  ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &side,              sizeof(MORSE_enum),
-            STARPU_VALUE,    &trans,             sizeof(MORSE_enum),
-            STARPU_VALUE,    &m1,                sizeof(int),
-            STARPU_VALUE,    &n1,                sizeof(int),
-            STARPU_VALUE,    &m2,                sizeof(int),
-            STARPU_VALUE,    &n2,                sizeof(int),
-            STARPU_VALUE,    &k,                 sizeof(int),
-            STARPU_VALUE,    &ib,                sizeof(int),
-            STARPU_RW,        RTBLKADDR(A1, MORSE_Complex64_t, A1m, A1n),
-            STARPU_VALUE,    &lda1,              sizeof(int),
-            STARPU_RW,        RTBLKADDR(A2, MORSE_Complex64_t, A2m, A2n),
-            STARPU_VALUE,    &lda2,              sizeof(int),
-            STARPU_R,         RTBLKADDR(V, MORSE_Complex64_t, Vm, Vn),
-            STARPU_VALUE,    &ldv,               sizeof(int),
-            STARPU_R,         RTBLKADDR(T, MORSE_Complex64_t, Tm, Tn),
-            STARPU_VALUE,    &ldt,               sizeof(int),
-            /* max( ib*nb, 2*ib*nb ) */
-            STARPU_SCRATCH,   options->ws_worker,
-            STARPU_VALUE,    &ldwork,            sizeof(int),
-            STARPU_PRIORITY,  options->priority,
-            STARPU_CALLBACK,  callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_RW(A1, A1m, A1n);
+    MORSE_ACCESS_RW(A2, A2m, A2n);
+    MORSE_ACCESS_R(V, Vm, Vn);
+    MORSE_ACCESS_R(T, Tm, Tn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &side,              sizeof(MORSE_enum),
+        STARPU_VALUE,    &trans,             sizeof(MORSE_enum),
+        STARPU_VALUE,    &m1,                sizeof(int),
+        STARPU_VALUE,    &n1,                sizeof(int),
+        STARPU_VALUE,    &m2,                sizeof(int),
+        STARPU_VALUE,    &n2,                sizeof(int),
+        STARPU_VALUE,    &k,                 sizeof(int),
+        STARPU_VALUE,    &ib,                sizeof(int),
+        STARPU_RW,        RTBLKADDR(A1, MORSE_Complex64_t, A1m, A1n),
+        STARPU_VALUE,    &lda1,              sizeof(int),
+        STARPU_RW,        RTBLKADDR(A2, MORSE_Complex64_t, A2m, A2n),
+        STARPU_VALUE,    &lda2,              sizeof(int),
+        STARPU_R,         RTBLKADDR(V, MORSE_Complex64_t, Vm, Vn),
+        STARPU_VALUE,    &ldv,               sizeof(int),
+        STARPU_R,         RTBLKADDR(T, MORSE_Complex64_t, Tm, Tn),
+        STARPU_VALUE,    &ldt,               sizeof(int),
+        /* max( ib*nb, 2*ib*nb ) */
+        STARPU_SCRATCH,   options->ws_worker,
+        STARPU_VALUE,    &ldwork,            sizeof(int),
+        STARPU_PRIORITY,  options->priority,
+        STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "ztsmlq",
+        STARPU_NAME, "ztsmlq",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_ztsmlq_hetra1.c b/runtime/starpu/codelets/codelet_ztsmlq_hetra1.c
index 0c1d3625584653584bd772962b5ca86ca1ac24b6..6a2a43768ba0209eaf265b685f7a329b0a81b76b 100644
--- a/runtime/starpu/codelets/codelet_ztsmlq_hetra1.c
+++ b/runtime/starpu/codelets/codelet_ztsmlq_hetra1.c
@@ -46,39 +46,40 @@ void MORSE_TASK_ztsmlq_hetra1(const MORSE_option_t *options,
 
     int ldwork = side == MorseLeft ? ib : nb;
 
-    /* T follows distribution of V */
-    if ( morse_desc_islocal( A1, A1m, A1n ) ||
-         morse_desc_islocal( A2, A2m, A2n ) ||
-         morse_desc_islocal( V,  Vm,  Vn  ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &side,              sizeof(MORSE_enum),
-            STARPU_VALUE,    &trans,             sizeof(MORSE_enum),
-            STARPU_VALUE,    &m1,                sizeof(int),
-            STARPU_VALUE,    &n1,                sizeof(int),
-            STARPU_VALUE,    &m2,                sizeof(int),
-            STARPU_VALUE,    &n2,                sizeof(int),
-            STARPU_VALUE,    &k,                 sizeof(int),
-            STARPU_VALUE,    &ib,                sizeof(int),
-            STARPU_VALUE,    &nb,                sizeof(int),
-            STARPU_RW,        RTBLKADDR(A1, MORSE_Complex64_t, A1m, A1n),
-            STARPU_VALUE,    &lda1,              sizeof(int),
-            STARPU_RW,        RTBLKADDR(A2, MORSE_Complex64_t, A2m, A2n),
-            STARPU_VALUE,    &lda2,              sizeof(int),
-            STARPU_R,         RTBLKADDR(V, MORSE_Complex64_t, Vm, Vn),
-            STARPU_VALUE,    &ldv,               sizeof(int),
-            STARPU_R,         RTBLKADDR(T, MORSE_Complex64_t, Tm, Tn),
-            STARPU_VALUE,    &ldt,               sizeof(int),
-            STARPU_SCRATCH,   options->ws_worker,
-            STARPU_VALUE,    &ldwork,            sizeof(int),
-            STARPU_PRIORITY,  options->priority,
-            STARPU_CALLBACK,  callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_RW(A1, A1m, A1n);
+    MORSE_ACCESS_RW(A2, A2m, A2n);
+    MORSE_ACCESS_R(V, Vm, Vn);
+    MORSE_ACCESS_R(T, Tm, Tn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &side,              sizeof(MORSE_enum),
+        STARPU_VALUE,    &trans,             sizeof(MORSE_enum),
+        STARPU_VALUE,    &m1,                sizeof(int),
+        STARPU_VALUE,    &n1,                sizeof(int),
+        STARPU_VALUE,    &m2,                sizeof(int),
+        STARPU_VALUE,    &n2,                sizeof(int),
+        STARPU_VALUE,    &k,                 sizeof(int),
+        STARPU_VALUE,    &ib,                sizeof(int),
+        STARPU_VALUE,    &nb,                sizeof(int),
+        STARPU_RW,        RTBLKADDR(A1, MORSE_Complex64_t, A1m, A1n),
+        STARPU_VALUE,    &lda1,              sizeof(int),
+        STARPU_RW,        RTBLKADDR(A2, MORSE_Complex64_t, A2m, A2n),
+        STARPU_VALUE,    &lda2,              sizeof(int),
+        STARPU_R,         RTBLKADDR(V, MORSE_Complex64_t, Vm, Vn),
+        STARPU_VALUE,    &ldv,               sizeof(int),
+        STARPU_R,         RTBLKADDR(T, MORSE_Complex64_t, Tm, Tn),
+        STARPU_VALUE,    &ldt,               sizeof(int),
+        STARPU_SCRATCH,   options->ws_worker,
+        STARPU_VALUE,    &ldwork,            sizeof(int),
+        STARPU_PRIORITY,  options->priority,
+        STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "ztsmlq_hetra1",
+        STARPU_NAME, "ztsmlq_hetra1",
 #endif
-            0);
-    }
+        0);
 }
 
 #if !defined(CHAMELEON_SIMULATION)
diff --git a/runtime/starpu/codelets/codelet_ztsmqr.c b/runtime/starpu/codelets/codelet_ztsmqr.c
index 7183c7f6f42c97a0ff19fdc165f4a6352c5ccf53..3f26f7c5803992b3c8af206676ef4acb6a7c15d6 100644
--- a/runtime/starpu/codelets/codelet_ztsmqr.c
+++ b/runtime/starpu/codelets/codelet_ztsmqr.c
@@ -170,43 +170,45 @@ void MORSE_TASK_ztsmqr(const MORSE_option_t *options,
         rank_changed = 1;
     }
 
-    if ( morse_desc_islocal( A1, A1m, A1n ) ||
-         morse_desc_islocal( A2, A2m, A2n ) ||
-         morse_desc_islocal( V,  Vm,  Vn  ) ||
-         morse_desc_islocal( T,  Tm,  Tn  ) ||
-         rank_changed )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &side,              sizeof(MORSE_enum),
-            STARPU_VALUE,    &trans,             sizeof(MORSE_enum),
-            STARPU_VALUE,    &m1,                sizeof(int),
-            STARPU_VALUE,    &n1,                sizeof(int),
-            STARPU_VALUE,    &m2,                sizeof(int),
-            STARPU_VALUE,    &n2,                sizeof(int),
-            STARPU_VALUE,    &k,                 sizeof(int),
-            STARPU_VALUE,    &ib,                sizeof(int),
-            STARPU_RW,        RTBLKADDR(A1, MORSE_Complex64_t, A1m, A1n),
-            STARPU_VALUE,    &lda1,              sizeof(int),
-            STARPU_RW,        RTBLKADDR(A2, MORSE_Complex64_t, A2m, A2n),
-            STARPU_VALUE,    &lda2,              sizeof(int),
-            STARPU_R,         RTBLKADDR(V, MORSE_Complex64_t, Vm, Vn),
-            STARPU_VALUE,    &ldv,               sizeof(int),
-            STARPU_R,         RTBLKADDR(T, MORSE_Complex64_t, Tm, Tn),
-            STARPU_VALUE,    &ldt,               sizeof(int),
-            /* max( ib*nb, 2*ib*nb ) */
-            STARPU_SCRATCH,   options->ws_worker,
-            STARPU_VALUE,    &ldwork,            sizeof(int),
-            STARPU_PRIORITY,  options->priority,
-            STARPU_CALLBACK,  callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_RW(A1, A1m, A1n);
+    MORSE_ACCESS_RW(A2, A2m, A2n);
+    MORSE_ACCESS_R(V, Vm, Vn);
+    MORSE_ACCESS_R(T, Tm, Tn);
+    if (rank_changed)
+        MORSE_RANK_CHANGED;
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &side,              sizeof(MORSE_enum),
+        STARPU_VALUE,    &trans,             sizeof(MORSE_enum),
+        STARPU_VALUE,    &m1,                sizeof(int),
+        STARPU_VALUE,    &n1,                sizeof(int),
+        STARPU_VALUE,    &m2,                sizeof(int),
+        STARPU_VALUE,    &n2,                sizeof(int),
+        STARPU_VALUE,    &k,                 sizeof(int),
+        STARPU_VALUE,    &ib,                sizeof(int),
+        STARPU_RW,        RTBLKADDR(A1, MORSE_Complex64_t, A1m, A1n),
+        STARPU_VALUE,    &lda1,              sizeof(int),
+        STARPU_RW,        RTBLKADDR(A2, MORSE_Complex64_t, A2m, A2n),
+        STARPU_VALUE,    &lda2,              sizeof(int),
+        STARPU_R,         RTBLKADDR(V, MORSE_Complex64_t, Vm, Vn),
+        STARPU_VALUE,    &ldv,               sizeof(int),
+        STARPU_R,         RTBLKADDR(T, MORSE_Complex64_t, Tm, Tn),
+        STARPU_VALUE,    &ldt,               sizeof(int),
+        /* max( ib*nb, 2*ib*nb ) */
+        STARPU_SCRATCH,   options->ws_worker,
+        STARPU_VALUE,    &ldwork,            sizeof(int),
+        STARPU_PRIORITY,  options->priority,
+        STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "ztsmqr",
+        STARPU_NAME, "ztsmqr",
 #endif
 #if defined(CHAMELEON_USE_MPI)
-            STARPU_EXECUTE_ON_NODE, execution_rank,
+        STARPU_EXECUTE_ON_NODE, execution_rank,
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_ztsmqr_hetra1.c b/runtime/starpu/codelets/codelet_ztsmqr_hetra1.c
index 16edc18b40e71dfa1468fd05569d3ea94ab01c71..792d9e0592832bb075a1916408fa983d9b82bef8 100644
--- a/runtime/starpu/codelets/codelet_ztsmqr_hetra1.c
+++ b/runtime/starpu/codelets/codelet_ztsmqr_hetra1.c
@@ -46,38 +46,39 @@ void MORSE_TASK_ztsmqr_hetra1(const MORSE_option_t *options,
 
     int ldwork = side == MorseLeft ? ib : nb;
 
-    /* T follows distribution of V */
-    if ( morse_desc_islocal( A1, A1m, A1n ) ||
-         morse_desc_islocal( A2, A2m, A2n ) ||
-         morse_desc_islocal( V,  Vm,  Vn  ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &side,              sizeof(MORSE_enum),
-            STARPU_VALUE,    &trans,             sizeof(MORSE_enum),
-            STARPU_VALUE,    &m1,                sizeof(int),
-            STARPU_VALUE,    &n1,                sizeof(int),
-            STARPU_VALUE,    &m2,                sizeof(int),
-            STARPU_VALUE,    &n2,                sizeof(int),
-            STARPU_VALUE,    &k,                 sizeof(int),
-            STARPU_VALUE,    &ib,                sizeof(int),
-            STARPU_RW,        RTBLKADDR(A1, MORSE_Complex64_t, A1m, A1n),
-            STARPU_VALUE,    &lda1,              sizeof(int),
-            STARPU_RW,        RTBLKADDR(A2, MORSE_Complex64_t, A2m, A2n),
-            STARPU_VALUE,    &lda2,              sizeof(int),
-            STARPU_R,         RTBLKADDR(V, MORSE_Complex64_t, Vm, Vn),
-            STARPU_VALUE,    &ldv,               sizeof(int),
-            STARPU_R,         RTBLKADDR(T, MORSE_Complex64_t, Tm, Tn),
-            STARPU_VALUE,    &ldt,               sizeof(int),
-            STARPU_SCRATCH,   options->ws_worker,
-            STARPU_VALUE,    &ldwork,            sizeof(int),
-            STARPU_PRIORITY,  options->priority,
-            STARPU_CALLBACK,  callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_RW(A1, A1m, A1n);
+    MORSE_ACCESS_RW(A2, A2m, A2n);
+    MORSE_ACCESS_R(V, Vm, Vn);
+    MORSE_ACCESS_R(T, Tm, Tn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &side,              sizeof(MORSE_enum),
+        STARPU_VALUE,    &trans,             sizeof(MORSE_enum),
+        STARPU_VALUE,    &m1,                sizeof(int),
+        STARPU_VALUE,    &n1,                sizeof(int),
+        STARPU_VALUE,    &m2,                sizeof(int),
+        STARPU_VALUE,    &n2,                sizeof(int),
+        STARPU_VALUE,    &k,                 sizeof(int),
+        STARPU_VALUE,    &ib,                sizeof(int),
+        STARPU_RW,        RTBLKADDR(A1, MORSE_Complex64_t, A1m, A1n),
+        STARPU_VALUE,    &lda1,              sizeof(int),
+        STARPU_RW,        RTBLKADDR(A2, MORSE_Complex64_t, A2m, A2n),
+        STARPU_VALUE,    &lda2,              sizeof(int),
+        STARPU_R,         RTBLKADDR(V, MORSE_Complex64_t, Vm, Vn),
+        STARPU_VALUE,    &ldv,               sizeof(int),
+        STARPU_R,         RTBLKADDR(T, MORSE_Complex64_t, Tm, Tn),
+        STARPU_VALUE,    &ldt,               sizeof(int),
+        STARPU_SCRATCH,   options->ws_worker,
+        STARPU_VALUE,    &ldwork,            sizeof(int),
+        STARPU_PRIORITY,  options->priority,
+        STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "ztsmqr_hetra1",
+        STARPU_NAME, "ztsmqr_hetra1",
 #endif
-            0);
-    }
+        0);
 }
 
 #if !defined(CHAMELEON_SIMULATION)
diff --git a/runtime/starpu/codelets/codelet_ztsqrt.c b/runtime/starpu/codelets/codelet_ztsqrt.c
index 7081a754a0aa53d583b6ecf97ce9f03840b46125..c16ca67736570afa9d99490686ef7d7c823b9949 100644
--- a/runtime/starpu/codelets/codelet_ztsqrt.c
+++ b/runtime/starpu/codelets/codelet_ztsqrt.c
@@ -108,33 +108,34 @@ void MORSE_TASK_ztsqrt(const MORSE_option_t *options,
     void (*callback)(void*) = options->profiling ? cl_ztsqrt_callback : NULL;
     MORSE_starpu_ws_t *h_work = (MORSE_starpu_ws_t*)(options->ws_host);
 
-    if ( morse_desc_islocal( A1, A1m, A1n ) ||
-         morse_desc_islocal( A2, A2m, A2n ) ||
-         morse_desc_islocal( T,  Tm,  Tn  ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &m,                 sizeof(int),
-            STARPU_VALUE,    &n,                 sizeof(int),
-            STARPU_VALUE,    &ib,                sizeof(int),
-            STARPU_RW,        RTBLKADDR(A1, MORSE_Complex64_t, A1m, A1n),
-            STARPU_VALUE,    &lda1,              sizeof(int),
-            STARPU_RW,        RTBLKADDR(A2, MORSE_Complex64_t, A2m, A2n),
-            STARPU_VALUE,    &lda2,              sizeof(int),
-            STARPU_W,         RTBLKADDR(T,  MORSE_Complex64_t, Tm,  Tn ),
-            STARPU_VALUE,    &ldt,               sizeof(int),
-            /* max( nb * (ib+1), ib * (ib+nb) ) */
-            STARPU_SCRATCH,   options->ws_worker,
-            /* 2 * ib * (nb+ib) + nb */
-            STARPU_VALUE,    &h_work,            sizeof(MORSE_starpu_ws_t *),
-            STARPU_PRIORITY,  options->priority,
-            STARPU_CALLBACK,  callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_RW(A1, A1m, A1n);
+    MORSE_ACCESS_RW(A2, A2m, A2n);
+    MORSE_ACCESS_W(T, Tm, Tn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &m,                 sizeof(int),
+        STARPU_VALUE,    &n,                 sizeof(int),
+        STARPU_VALUE,    &ib,                sizeof(int),
+        STARPU_RW,        RTBLKADDR(A1, MORSE_Complex64_t, A1m, A1n),
+        STARPU_VALUE,    &lda1,              sizeof(int),
+        STARPU_RW,        RTBLKADDR(A2, MORSE_Complex64_t, A2m, A2n),
+        STARPU_VALUE,    &lda2,              sizeof(int),
+        STARPU_W,         RTBLKADDR(T,  MORSE_Complex64_t, Tm,  Tn ),
+        STARPU_VALUE,    &ldt,               sizeof(int),
+        /* max( nb * (ib+1), ib * (ib+nb) ) */
+        STARPU_SCRATCH,   options->ws_worker,
+        /* 2 * ib * (nb+ib) + nb */
+        STARPU_VALUE,    &h_work,            sizeof(MORSE_starpu_ws_t *),
+        STARPU_PRIORITY,  options->priority,
+        STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "ztsqrt",
+        STARPU_NAME, "ztsqrt",
 #endif
-            STARPU_EXECUTE_ON_NODE, A2->get_rankof(A2, A2m, A2n),
-            0);
-    }
+        STARPU_EXECUTE_ON_NODE, A2->get_rankof(A2, A2m, A2n),
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_ztstrf.c b/runtime/starpu/codelets/codelet_ztstrf.c
index 0628740d9bc0f0cc6fb797b80eb45addcc3e7599..eae5108ee9c28ba1335d524f6b6a5dd9a65c060f 100644
--- a/runtime/starpu/codelets/codelet_ztstrf.c
+++ b/runtime/starpu/codelets/codelet_ztstrf.c
@@ -113,35 +113,36 @@ void MORSE_TASK_ztstrf(const MORSE_option_t *options,
     void (*callback)(void*) = options->profiling ? cl_ztstrf_callback : NULL;
     MORSE_starpu_ws_t *d_work = (MORSE_starpu_ws_t*)(options->ws_host);
 
-    if ( morse_desc_islocal( U, Um, Un ) ||
-         morse_desc_islocal( A, Am, An ) ||
-         morse_desc_islocal( L, Lm, Ln ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &m,                         sizeof(int),
-            STARPU_VALUE,    &n,                         sizeof(int),
-            STARPU_VALUE,    &ib,                        sizeof(int),
-            STARPU_VALUE,    &nb,                        sizeof(int),
-            STARPU_RW,        RTBLKADDR(U, MORSE_Complex64_t, Um, Un),
-            STARPU_VALUE,    &ldu,                       sizeof(int),
-            STARPU_RW,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,    &lda,                       sizeof(int),
-            STARPU_W,         RTBLKADDR(L, MORSE_Complex64_t, Lm, Ln),
-            STARPU_VALUE,    &ldl,                       sizeof(int),
-            STARPU_VALUE,    &IPIV,                      sizeof(int*),
-            STARPU_SCRATCH,   options->ws_worker,
-            STARPU_VALUE,    &d_work,                    sizeof(MORSE_starpu_ws_t *),
-            STARPU_VALUE,    &nb,                        sizeof(int),
-            STARPU_VALUE,    &check_info,                sizeof(MORSE_bool),
-            STARPU_VALUE,    &iinfo,                     sizeof(int),
-            STARPU_PRIORITY,  options->priority,
-            STARPU_CALLBACK,  callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_RW(U, Um, Un);
+    MORSE_ACCESS_RW(A, Am, An);
+    MORSE_ACCESS_W(L, Lm, Ln);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &m,                         sizeof(int),
+        STARPU_VALUE,    &n,                         sizeof(int),
+        STARPU_VALUE,    &ib,                        sizeof(int),
+        STARPU_VALUE,    &nb,                        sizeof(int),
+        STARPU_RW,        RTBLKADDR(U, MORSE_Complex64_t, Um, Un),
+        STARPU_VALUE,    &ldu,                       sizeof(int),
+        STARPU_RW,        RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,    &lda,                       sizeof(int),
+        STARPU_W,         RTBLKADDR(L, MORSE_Complex64_t, Lm, Ln),
+        STARPU_VALUE,    &ldl,                       sizeof(int),
+        STARPU_VALUE,    &IPIV,                      sizeof(int*),
+        STARPU_SCRATCH,   options->ws_worker,
+        STARPU_VALUE,    &d_work,                    sizeof(MORSE_starpu_ws_t *),
+        STARPU_VALUE,    &nb,                        sizeof(int),
+        STARPU_VALUE,    &check_info,                sizeof(MORSE_bool),
+        STARPU_VALUE,    &iinfo,                     sizeof(int),
+        STARPU_PRIORITY,  options->priority,
+        STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "ztstrf",
+        STARPU_NAME, "ztstrf",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_zttlqt.c b/runtime/starpu/codelets/codelet_zttlqt.c
index 269cec7a973661dff42dbec34f6d0dc3c13ed39a..f89913e6922496aa20d3ce275461b3805dc97c78 100644
--- a/runtime/starpu/codelets/codelet_zttlqt.c
+++ b/runtime/starpu/codelets/codelet_zttlqt.c
@@ -117,30 +117,31 @@ void MORSE_TASK_zttlqt(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zttlqt;
     void (*callback)(void*) = options->profiling ? cl_zttlqt_callback : NULL;
 
-    if ( morse_desc_islocal( A1, A1m, A1n ) ||
-         morse_desc_islocal( A2, A2m, A2n ) ||
-         morse_desc_islocal( T,  Tm,  Tn  ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &m,                 sizeof(int),
-            STARPU_VALUE,    &n,                 sizeof(int),
-            STARPU_VALUE,    &ib,                sizeof(int),
-            STARPU_RW,        RTBLKADDR(A1, MORSE_Complex64_t, A1m, A1n),
-            STARPU_VALUE,    &lda1,              sizeof(int),
-            STARPU_RW,        RTBLKADDR(A2, MORSE_Complex64_t, A2m, A2n),
-            STARPU_VALUE,    &lda2,              sizeof(int),
-            STARPU_W,         RTBLKADDR(T, MORSE_Complex64_t, Tm, Tn),
-            STARPU_VALUE,    &ldt,               sizeof(int),
-             /* nb * (ib+1) */
-            STARPU_SCRATCH,   options->ws_worker,
-            STARPU_PRIORITY,  options->priority,
-            STARPU_CALLBACK,  callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_RW(A1, A1m, A1n);
+    MORSE_ACCESS_RW(A2, A2m, A2n);
+    MORSE_ACCESS_W(T, Tm, Tn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &m,                 sizeof(int),
+        STARPU_VALUE,    &n,                 sizeof(int),
+        STARPU_VALUE,    &ib,                sizeof(int),
+        STARPU_RW,        RTBLKADDR(A1, MORSE_Complex64_t, A1m, A1n),
+        STARPU_VALUE,    &lda1,              sizeof(int),
+        STARPU_RW,        RTBLKADDR(A2, MORSE_Complex64_t, A2m, A2n),
+        STARPU_VALUE,    &lda2,              sizeof(int),
+        STARPU_W,         RTBLKADDR(T, MORSE_Complex64_t, Tm, Tn),
+        STARPU_VALUE,    &ldt,               sizeof(int),
+         /* nb * (ib+1) */
+        STARPU_SCRATCH,   options->ws_worker,
+        STARPU_PRIORITY,  options->priority,
+        STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zttlqt",
+        STARPU_NAME, "zttlqt",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_zttmlq.c b/runtime/starpu/codelets/codelet_zttmlq.c
index ca03af3c7e836b6a241288974a683b19e93d0573..2a75969c1e45651602f21fa00aaf707510f393f0 100644
--- a/runtime/starpu/codelets/codelet_zttmlq.c
+++ b/runtime/starpu/codelets/codelet_zttmlq.c
@@ -138,39 +138,40 @@ void MORSE_TASK_zttmlq(const MORSE_option_t *options,
     void (*callback)(void*) = options->profiling ? cl_zttmlq_callback : NULL;
     int ldwork = side == MorseLeft ? ib : nb;
 
-    if ( morse_desc_islocal( A1, A1m, A1n ) ||
-         morse_desc_islocal( A2, A2m, A2n ) ||
-         morse_desc_islocal( V,  Vm,  Vn  ) ||
-         morse_desc_islocal( T,  Tm,  Tn  ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &side,              sizeof(MORSE_enum),
-            STARPU_VALUE,    &trans,             sizeof(MORSE_enum),
-            STARPU_VALUE,    &m1,                sizeof(int),
-            STARPU_VALUE,    &n1,                sizeof(int),
-            STARPU_VALUE,    &m2,                sizeof(int),
-            STARPU_VALUE,    &n2,                sizeof(int),
-            STARPU_VALUE,    &k,                 sizeof(int),
-            STARPU_VALUE,    &ib,                sizeof(int),
-            STARPU_RW,        RTBLKADDR(A1, MORSE_Complex64_t, A1m, A1n),
-            STARPU_VALUE,    &lda1,              sizeof(int),
-            STARPU_RW,        RTBLKADDR(A2, MORSE_Complex64_t, A2m, A2n),
-            STARPU_VALUE,    &lda2,              sizeof(int),
-            STARPU_R,         RTBLKADDR(V, MORSE_Complex64_t, Vm, Vn),
-            STARPU_VALUE,    &ldv,               sizeof(int),
-            STARPU_R,         RTBLKADDR(T, MORSE_Complex64_t, Tm, Tn),
-            STARPU_VALUE,    &ldt,               sizeof(int),
-             /* nb * ib */
-            STARPU_SCRATCH,   options->ws_worker,
-            STARPU_VALUE,    &ldwork,            sizeof(int),
-            STARPU_PRIORITY,  options->priority,
-            STARPU_CALLBACK,  callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_RW(A1, A1m, A1n);
+    MORSE_ACCESS_RW(A2, A2m, A2n);
+    MORSE_ACCESS_R(V, Vm, Vn);
+    MORSE_ACCESS_R(T, Tm, Tn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &side,              sizeof(MORSE_enum),
+        STARPU_VALUE,    &trans,             sizeof(MORSE_enum),
+        STARPU_VALUE,    &m1,                sizeof(int),
+        STARPU_VALUE,    &n1,                sizeof(int),
+        STARPU_VALUE,    &m2,                sizeof(int),
+        STARPU_VALUE,    &n2,                sizeof(int),
+        STARPU_VALUE,    &k,                 sizeof(int),
+        STARPU_VALUE,    &ib,                sizeof(int),
+        STARPU_RW,        RTBLKADDR(A1, MORSE_Complex64_t, A1m, A1n),
+        STARPU_VALUE,    &lda1,              sizeof(int),
+        STARPU_RW,        RTBLKADDR(A2, MORSE_Complex64_t, A2m, A2n),
+        STARPU_VALUE,    &lda2,              sizeof(int),
+        STARPU_R,         RTBLKADDR(V, MORSE_Complex64_t, Vm, Vn),
+        STARPU_VALUE,    &ldv,               sizeof(int),
+        STARPU_R,         RTBLKADDR(T, MORSE_Complex64_t, Tm, Tn),
+        STARPU_VALUE,    &ldt,               sizeof(int),
+         /* nb * ib */
+        STARPU_SCRATCH,   options->ws_worker,
+        STARPU_VALUE,    &ldwork,            sizeof(int),
+        STARPU_PRIORITY,  options->priority,
+        STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zttmlq",
+        STARPU_NAME, "zttmlq",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_zttmqr.c b/runtime/starpu/codelets/codelet_zttmqr.c
index e31b558607eec2c9588e636221fc2bb890e70fac..f16d3f0b07408cdb4b75bd22e850d872571cbe22 100644
--- a/runtime/starpu/codelets/codelet_zttmqr.c
+++ b/runtime/starpu/codelets/codelet_zttmqr.c
@@ -163,43 +163,45 @@ void MORSE_TASK_zttmqr(const MORSE_option_t *options,
         rank_changed = 1;
     }
 
-    if ( morse_desc_islocal( A1, A1m, A1n ) ||
-         morse_desc_islocal( A2, A2m, A2n ) ||
-         morse_desc_islocal( V,  Vm,  Vn  ) ||
-         morse_desc_islocal( T,  Tm,  Tn  ) ||
-         rank_changed )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &side,              sizeof(MORSE_enum),
-            STARPU_VALUE,    &trans,             sizeof(MORSE_enum),
-            STARPU_VALUE,    &m1,                sizeof(int),
-            STARPU_VALUE,    &n1,                sizeof(int),
-            STARPU_VALUE,    &m2,                sizeof(int),
-            STARPU_VALUE,    &n2,                sizeof(int),
-            STARPU_VALUE,    &k,                 sizeof(int),
-            STARPU_VALUE,    &ib,                sizeof(int),
-            STARPU_RW,        RTBLKADDR(A1, MORSE_Complex64_t, A1m, A1n),
-            STARPU_VALUE,    &lda1,              sizeof(int),
-            STARPU_RW,        RTBLKADDR(A2, MORSE_Complex64_t, A2m, A2n),
-            STARPU_VALUE,    &lda2,              sizeof(int),
-            STARPU_R,         RTBLKADDR(V, MORSE_Complex64_t, Vm, Vn),
-            STARPU_VALUE,    &ldv,               sizeof(int),
-            STARPU_R,         RTBLKADDR(T, MORSE_Complex64_t, Tm, Tn),
-            STARPU_VALUE,    &ldt,               sizeof(int),
-             /* nb * ib */
-            STARPU_SCRATCH,   options->ws_worker,
-            STARPU_VALUE,    &ldwork,            sizeof(int),
-            STARPU_PRIORITY,  options->priority,
-            STARPU_CALLBACK,  callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_RW(A1, A1m, A1n);
+    MORSE_ACCESS_RW(A2, A2m, A2n);
+    MORSE_ACCESS_R(V, Vm, Vn);
+    MORSE_ACCESS_R(T, Tm, Tn);
+    if (rank_changed)
+        MORSE_RANK_CHANGED;
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &side,              sizeof(MORSE_enum),
+        STARPU_VALUE,    &trans,             sizeof(MORSE_enum),
+        STARPU_VALUE,    &m1,                sizeof(int),
+        STARPU_VALUE,    &n1,                sizeof(int),
+        STARPU_VALUE,    &m2,                sizeof(int),
+        STARPU_VALUE,    &n2,                sizeof(int),
+        STARPU_VALUE,    &k,                 sizeof(int),
+        STARPU_VALUE,    &ib,                sizeof(int),
+        STARPU_RW,        RTBLKADDR(A1, MORSE_Complex64_t, A1m, A1n),
+        STARPU_VALUE,    &lda1,              sizeof(int),
+        STARPU_RW,        RTBLKADDR(A2, MORSE_Complex64_t, A2m, A2n),
+        STARPU_VALUE,    &lda2,              sizeof(int),
+        STARPU_R,         RTBLKADDR(V, MORSE_Complex64_t, Vm, Vn),
+        STARPU_VALUE,    &ldv,               sizeof(int),
+        STARPU_R,         RTBLKADDR(T, MORSE_Complex64_t, Tm, Tn),
+        STARPU_VALUE,    &ldt,               sizeof(int),
+         /* nb * ib */
+        STARPU_SCRATCH,   options->ws_worker,
+        STARPU_VALUE,    &ldwork,            sizeof(int),
+        STARPU_PRIORITY,  options->priority,
+        STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_USE_MPI)
-            STARPU_EXECUTE_ON_NODE, execution_rank,
+        STARPU_EXECUTE_ON_NODE, execution_rank,
 #endif
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zttmqr",
+        STARPU_NAME, "zttmqr",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_zttqrt.c b/runtime/starpu/codelets/codelet_zttqrt.c
index b368a3202a70036be6afb7db92e29f8ae9a91f25..02bc8245873c567e641f76b5e7b0bac82e613628 100644
--- a/runtime/starpu/codelets/codelet_zttqrt.c
+++ b/runtime/starpu/codelets/codelet_zttqrt.c
@@ -117,30 +117,31 @@ void MORSE_TASK_zttqrt(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zttqrt;
     void (*callback)(void*) = options->profiling ? cl_zttqrt_callback : NULL;
 
-    if ( morse_desc_islocal( A1, A1m, A1n ) ||
-         morse_desc_islocal( A2, A2m, A2n ) ||
-         morse_desc_islocal( T,  Tm,  Tn  ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &m,                 sizeof(int),
-            STARPU_VALUE,    &n,                 sizeof(int),
-            STARPU_VALUE,    &ib,                sizeof(int),
-            STARPU_RW,        RTBLKADDR(A1, MORSE_Complex64_t, A1m, A1n),
-            STARPU_VALUE,    &lda1,              sizeof(int),
-            STARPU_RW,        RTBLKADDR(A2, MORSE_Complex64_t, A2m, A2n),
-            STARPU_VALUE,    &lda2,              sizeof(int),
-            STARPU_W,         RTBLKADDR(T, MORSE_Complex64_t, Tm, Tn),
-            STARPU_VALUE,    &ldt,               sizeof(int),
-             /* nb * (ib+1) */
-            STARPU_SCRATCH,   options->ws_worker,
-            STARPU_PRIORITY,  options->priority,
-            STARPU_CALLBACK,  callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_RW(A1, A1m, A1n);
+    MORSE_ACCESS_RW(A2, A2m, A2n);
+    MORSE_ACCESS_W(T, Tm, Tn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &m,                 sizeof(int),
+        STARPU_VALUE,    &n,                 sizeof(int),
+        STARPU_VALUE,    &ib,                sizeof(int),
+        STARPU_RW,        RTBLKADDR(A1, MORSE_Complex64_t, A1m, A1n),
+        STARPU_VALUE,    &lda1,              sizeof(int),
+        STARPU_RW,        RTBLKADDR(A2, MORSE_Complex64_t, A2m, A2n),
+        STARPU_VALUE,    &lda2,              sizeof(int),
+        STARPU_W,         RTBLKADDR(T, MORSE_Complex64_t, Tm, Tn),
+        STARPU_VALUE,    &ldt,               sizeof(int),
+         /* nb * (ib+1) */
+        STARPU_SCRATCH,   options->ws_worker,
+        STARPU_PRIORITY,  options->priority,
+        STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zttqrt",
+        STARPU_NAME, "zttqrt",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_zunmlq.c b/runtime/starpu/codelets/codelet_zunmlq.c
index 956d92643e51e0d09601ce45be9ec514c10beaf9..6525661f635f020ec7c234e456eeca32ecbd177c 100644
--- a/runtime/starpu/codelets/codelet_zunmlq.c
+++ b/runtime/starpu/codelets/codelet_zunmlq.c
@@ -127,34 +127,35 @@ void MORSE_TASK_zunmlq(const MORSE_option_t *options,
     struct starpu_codelet *codelet = &cl_zunmlq;
     void (*callback)(void*) = options->profiling ? cl_zunmlq_callback : NULL;
 
-    if ( morse_desc_islocal( A, Am, An ) ||
-         morse_desc_islocal( T, Tm, Tn ) ||
-         morse_desc_islocal( C, Cm, Cn ) )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &side,              sizeof(MORSE_enum),
-            STARPU_VALUE,    &trans,             sizeof(MORSE_enum),
-            STARPU_VALUE,    &m,                 sizeof(int),
-            STARPU_VALUE,    &n,                 sizeof(int),
-            STARPU_VALUE,    &k,                 sizeof(int),
-            STARPU_VALUE,    &ib,                sizeof(int),
-            STARPU_R,         RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,    &lda,               sizeof(int),
-            STARPU_R,         RTBLKADDR(T, MORSE_Complex64_t, Tm, Tn),
-            STARPU_VALUE,    &ldt,               sizeof(int),
-            STARPU_RW,        RTBLKADDR(C, MORSE_Complex64_t, Cm, Cn),
-            STARPU_VALUE,    &ldc,               sizeof(int),
-            /* ib * nb */
-            STARPU_SCRATCH,   options->ws_worker,
-            STARPU_VALUE,    &nb,                sizeof(int),
-            STARPU_PRIORITY,  options->priority,
-            STARPU_CALLBACK,  callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_R(A, Am, An);
+    MORSE_ACCESS_R(T, Tm, Tn);
+    MORSE_ACCESS_RW(C, Cm, Cn);
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &side,              sizeof(MORSE_enum),
+        STARPU_VALUE,    &trans,             sizeof(MORSE_enum),
+        STARPU_VALUE,    &m,                 sizeof(int),
+        STARPU_VALUE,    &n,                 sizeof(int),
+        STARPU_VALUE,    &k,                 sizeof(int),
+        STARPU_VALUE,    &ib,                sizeof(int),
+        STARPU_R,         RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,    &lda,               sizeof(int),
+        STARPU_R,         RTBLKADDR(T, MORSE_Complex64_t, Tm, Tn),
+        STARPU_VALUE,    &ldt,               sizeof(int),
+        STARPU_RW,        RTBLKADDR(C, MORSE_Complex64_t, Cm, Cn),
+        STARPU_VALUE,    &ldc,               sizeof(int),
+        /* ib * nb */
+        STARPU_SCRATCH,   options->ws_worker,
+        STARPU_VALUE,    &nb,                sizeof(int),
+        STARPU_PRIORITY,  options->priority,
+        STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zunmlq",
+        STARPU_NAME, "zunmlq",
 #endif
-            0);
-    }
+        0);
 }
 
 
diff --git a/runtime/starpu/codelets/codelet_zunmqr.c b/runtime/starpu/codelets/codelet_zunmqr.c
index fcbf06a7ec3ae8dda9addac2d6cc6ad916c140cb..3c981f4bbb0a2349580ed9d6443b914389e388cd 100644
--- a/runtime/starpu/codelets/codelet_zunmqr.c
+++ b/runtime/starpu/codelets/codelet_zunmqr.c
@@ -148,38 +148,40 @@ void MORSE_TASK_zunmqr(const MORSE_option_t *options,
         rank_changed = 1;
     }
 
-    if ( morse_desc_islocal( A, Am, An ) ||
-         morse_desc_islocal( T, Tm, Tn ) ||
-         morse_desc_islocal( C, Cm, Cn ) ||
-         rank_changed )
-    {
-        starpu_insert_task(
-            starpu_mpi_codelet(codelet),
-            STARPU_VALUE,    &side,              sizeof(MORSE_enum),
-            STARPU_VALUE,    &trans,             sizeof(MORSE_enum),
-            STARPU_VALUE,    &m,                 sizeof(int),
-            STARPU_VALUE,    &n,                 sizeof(int),
-            STARPU_VALUE,    &k,                 sizeof(int),
-            STARPU_VALUE,    &ib,                sizeof(int),
-            STARPU_R,         RTBLKADDR(A, MORSE_Complex64_t, Am, An),
-            STARPU_VALUE,    &lda,               sizeof(int),
-            STARPU_R,         RTBLKADDR(T, MORSE_Complex64_t, Tm, Tn),
-            STARPU_VALUE,    &ldt,               sizeof(int),
-            STARPU_RW,        RTBLKADDR(C, MORSE_Complex64_t, Cm, Cn),
-            STARPU_VALUE,    &ldc,               sizeof(int),
-            /* ib * nb */
-            STARPU_SCRATCH,   options->ws_worker,
-            STARPU_VALUE,    &nb,                sizeof(int),
-            STARPU_PRIORITY,  options->priority,
-            STARPU_CALLBACK,  callback,
+    MORSE_BEGIN_ACCESS_DECLARATION;
+    MORSE_ACCESS_R(A, Am, An);
+    MORSE_ACCESS_R(T, Tm, Tn);
+    MORSE_ACCESS_RW(C, Cm, Cn);
+    if (rank_changed)
+        MORSE_RANK_CHANGED;
+    MORSE_END_ACCESS_DECLARATION;
+
+    starpu_insert_task(
+        starpu_mpi_codelet(codelet),
+        STARPU_VALUE,    &side,              sizeof(MORSE_enum),
+        STARPU_VALUE,    &trans,             sizeof(MORSE_enum),
+        STARPU_VALUE,    &m,                 sizeof(int),
+        STARPU_VALUE,    &n,                 sizeof(int),
+        STARPU_VALUE,    &k,                 sizeof(int),
+        STARPU_VALUE,    &ib,                sizeof(int),
+        STARPU_R,         RTBLKADDR(A, MORSE_Complex64_t, Am, An),
+        STARPU_VALUE,    &lda,               sizeof(int),
+        STARPU_R,         RTBLKADDR(T, MORSE_Complex64_t, Tm, Tn),
+        STARPU_VALUE,    &ldt,               sizeof(int),
+        STARPU_RW,        RTBLKADDR(C, MORSE_Complex64_t, Cm, Cn),
+        STARPU_VALUE,    &ldc,               sizeof(int),
+        /* ib * nb */
+        STARPU_SCRATCH,   options->ws_worker,
+        STARPU_VALUE,    &nb,                sizeof(int),
+        STARPU_PRIORITY,  options->priority,
+        STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_USE_MPI)
-            STARPU_EXECUTE_ON_NODE, execution_rank,
+        STARPU_EXECUTE_ON_NODE, execution_rank,
 #endif
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
-            STARPU_NAME, "zunmqr",
+        STARPU_NAME, "zunmqr",
 #endif
-            0);
-    }
+        0);
 }