diff --git a/runtime/parsec/control/runtime_descriptor.c b/runtime/parsec/control/runtime_descriptor.c
index e53cda3479a7e5c12834db468e95225a89fe6efb..9a48b76de339a00d9064d29337b79624e4d5ec02 100644
--- a/runtime/parsec/control/runtime_descriptor.c
+++ b/runtime/parsec/control/runtime_descriptor.c
@@ -23,7 +23,18 @@
 #include <parsec/datatype.h>
 #include <parsec/arena.h>
 
-static int parsec_global_arena_index = 0;
+/* Variable parsec_dtd_no_of_arenas is private and cannot be changed */
+#define MORSE_PARSEC_DTD_NO_OF_ARENA 16 /**< Number of arenas available per DTD */
+
+typedef struct morse_parsec_arena_s {
+    /* int mb; */
+    /* int nb; */
+    /* MORSE_enum dtype; */
+    size_t size;
+} morse_parsec_arena_t;
+
+static int morse_parsec_nb_arenas = 0;
+static morse_parsec_arena_t morse_parsec_registered_arenas[MORSE_PARSEC_DTD_NO_OF_ARENA] = { { 0 } };
 
 void RUNTIME_comm_set_tag_sizes( int user_tag_width,
                                  int user_tag_sep )
@@ -44,18 +55,6 @@ void RUNTIME_free( void *ptr, size_t size )
     return;
 }
 
-struct morse_parsec_desc_s {
-    parsec_data_collection_t  super;
-    MORSE_desc_t  *desc;
-    parsec_data_t **data_map;
-    int arena_index;
-};
-
-int
-morse_parsec_get_arena_index(const MORSE_desc_t *desc) {
-    return ((morse_parsec_desc_t *)desc->schedopt)->arena_index;
-}
-
 static inline void
 morse_parsec_key_to_coordinates(parsec_data_collection_t *data_collection, parsec_data_key_t key,
                                 int *m, int *n)
@@ -246,23 +245,47 @@ void RUNTIME_desc_create( MORSE_desc_t *mdesc )
 
     /* taskpool init to bypass a requirement of PaRSEC  */
 #if defined(CHAMELEON_USE_MPI)
-    parsec_dtd_taskpool_new();
-    /* Internal limitation of PaRSEC */
-    assert(parsec_global_arena_index < 16);
-    pdesc->arena_index = 0; /*parsec_global_arena_index++;*/
-
-    parsec_datatype_t datatype;
-    switch(mdesc->dtyp) {
-    case MorseInteger:       datatype = parsec_datatype_int32_t; break;
-    case MorseRealFloat:     datatype = parsec_datatype_float_t; break;
-    case MorseRealDouble:    datatype = parsec_datatype_double_t; break;
-    case MorseComplexFloat:  datatype = parsec_datatype_complex_t; break;
-    case MorseComplexDouble: datatype = parsec_datatype_double_complex_t; break;
-    default: morse_fatal_error("MORSE_Element_Size", "undefined type"); break;
-    }
+    /* Look if an arena already exists for this descriptor */
+    {
+        morse_parsec_arena_t *arena = morse_parsec_registered_arenas;
+        size_t size = mdesc->mb * mdesc->nb * MORSE_Element_Size(mdesc->dtyp);
+        int i;
 
-    parsec_matrix_add2arena_tile( parsec_dtd_arenas[pdesc->arena_index], datatype,
-                                  mdesc->mb * mdesc->nb * MORSE_Element_Size(mdesc->dtyp) );
+        for(i=0; i<morse_parsec_nb_arenas; i++, arena++) {
+            if ( size == arena->size) {
+                pdesc->arena_index = i;
+                break;
+            }
+        }
+
+        if (i == morse_parsec_nb_arenas) {
+            parsec_datatype_t datatype;
+
+            /* Create a taskpool to make sur the system is initialized */
+            if ( i == 0 ) {
+                parsec_taskpool_t *tp = parsec_dtd_taskpool_new();
+                parsec_taskpool_free( tp );
+            }
+
+            /* Internal limitation of PaRSEC */
+            assert(morse_parsec_nb_arenas < MORSE_PARSEC_DTD_NO_OF_ARENA);
+
+            switch(mdesc->dtyp) {
+            case MorseInteger:       datatype = parsec_datatype_int32_t; break;
+            case MorseRealFloat:     datatype = parsec_datatype_float_t; break;
+            case MorseRealDouble:    datatype = parsec_datatype_double_t; break;
+            case MorseComplexFloat:  datatype = parsec_datatype_complex_t; break;
+            case MorseComplexDouble: datatype = parsec_datatype_double_complex_t; break;
+            default: morse_fatal_error("MORSE_Element_Size", "undefined type"); break;
+            }
+
+            /* Register the new arena */
+            parsec_matrix_add2arena_tile( parsec_dtd_arenas[i], datatype, size );
+            arena->size = size;
+            pdesc->arena_index = i;
+            morse_parsec_nb_arenas++;
+        }
+    }
 #endif
     /* /\* Overwrite the leading dimensions to store the padding *\/ */
     /* mdesc->llm = mdesc->mb * mdesc->lmt; */
diff --git a/runtime/parsec/include/chameleon_parsec.h b/runtime/parsec/include/chameleon_parsec.h
index f33ac9b34b34edab94cead94bab20293ba4d1ee2..6238dd0c2d8307fbe9364fe3ffe4bd8bf5d8807b 100644
--- a/runtime/parsec/include/chameleon_parsec.h
+++ b/runtime/parsec/include/chameleon_parsec.h
@@ -29,10 +29,19 @@
 
 #include "control/common.h"
 
-struct morse_parsec_desc_s;
+struct morse_parsec_desc_s {
+    parsec_data_collection_t super;
+    int                      arena_index;
+    MORSE_desc_t            *desc;
+    parsec_data_t          **data_map;
+};
+
 typedef struct morse_parsec_desc_s morse_parsec_desc_t;
 
-int morse_parsec_get_arena_index(const MORSE_desc_t *desc);
+static inline int
+morse_parsec_get_arena_index(const MORSE_desc_t *desc) {
+    return ((morse_parsec_desc_t *)desc->schedopt)->arena_index;
+}
 
 /*
  * Access to block pointer and leading dimension