diff --git a/control/descriptor.c b/control/descriptor.c
index 69ee99393f0d05a34a23919bb1c9c0e1a482fd18..276195b7e15b6514b7ed954bf3828332a28ae985 100644
--- a/control/descriptor.c
+++ b/control/descriptor.c
@@ -4,7 +4,7 @@
  *                          of Tennessee Research Foundation.
  *                          All rights reserved.
  * @copyright (c) 2012-2014 Inria. All rights reserved.
- * @copyright (c) 2012-2015 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved.
+ * @copyright (c) 2012-2016 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved.
  *
  **/
 
@@ -406,9 +406,10 @@ int morse_desc_mat_free( MORSE_desc_t *desc )
     if (desc->mat != NULL  &&
         desc->use_mat == 1 &&
         desc->alloc_mat == 1) {
-#if !defined(CHAMELEON_SIMULATION) || defined(CHAMELEON_USE_MPI)
-        free(desc->mat);
-#endif
+        size_t size = (size_t)(desc->llm) * (size_t)(desc->lln)
+            * (size_t)MORSE_Element_Size(desc->dtyp);
+
+        RUNTIME_mat_free(desc->mat, size);
         desc->mat = NULL;
     }
     return MORSE_SUCCESS;
@@ -496,20 +497,14 @@ int MORSE_Desc_Create(MORSE_desc_t **desc, void *mat, MORSE_enum dtyp, int mb, i
 
     if (mat == NULL) {
 
-#if defined(CHAMELEON_SIMULATION) && !defined(CHAMELEON_USE_MPI)
-        (*desc)->mat = (void*) 1;
-#else
-        /* TODO: a call to morse_desc_mat_alloc should be made, but require to
-        move the call to RUNTIME_desc_create within the function */
         size_t size = (size_t)((*desc)->llm) * (size_t)((*desc)->lln)
             * (size_t)MORSE_Element_Size((*desc)->dtyp);
 
-        if (((*desc)->mat = malloc(size)) == NULL) {
+        if (((*desc)->mat = RUNTIME_mat_alloc(size)) == NULL) {
             morse_error("MORSE_Desc_Create", "malloc() failed");
             return MORSE_ERR_OUT_OF_RESOURCES;
         }
         (*desc)->alloc_mat = 1;
-#endif
 
     } else {
         (*desc)->mat = mat;
diff --git a/include/runtime.h b/include/runtime.h
index 3e56cf5626a3cf2e472a519985927345102df099..38b2ed213153a1859f3a10b4b6d81ff7a5055b2a 100644
--- a/include/runtime.h
+++ b/include/runtime.h
@@ -4,7 +4,7 @@
  *                          of Tennessee Research Foundation.
  *                          All rights reserved.
  * @copyright (c) 2012-2014 Inria. All rights reserved.
- * @copyright (c) 2012-2015 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved.
+ * @copyright (c) 2012-2016 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved.
  *
  **/
 
@@ -60,6 +60,8 @@ void  RUNTIME_comm_size          (int*);
 /*******************************************************************************
  * RUNTIME Descriptor
  **/
+void* RUNTIME_mat_alloc      (size_t);
+void  RUNTIME_mat_free       (void*, size_t);
 void  RUNTIME_desc_init      (MORSE_desc_t*);
 void  RUNTIME_desc_create    (MORSE_desc_t*);
 void  RUNTIME_desc_destroy   (MORSE_desc_t*);
diff --git a/runtime/parsec/control/runtime_descriptor.c b/runtime/parsec/control/runtime_descriptor.c
index a68af492aecfcd07720bf950009d8954e6ff7484..2a471292be541c728c6fbf048675a1a7a96ddb36 100644
--- a/runtime/parsec/control/runtime_descriptor.c
+++ b/runtime/parsec/control/runtime_descriptor.c
@@ -4,13 +4,25 @@
  *                          of Tennessee Research Foundation.
  *                          All rights reserved.
  * @copyright (c) 2012-2015 Inria. All rights reserved.
- * @copyright (c) 2012-2015 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved.
+ * @copyright (c) 2012-2016 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved.
  *
  **/
 #include <stdlib.h>
 #include "runtime/parsec/include/morse_parsec.h"
 #include <dague/data.h>
 
+void *RUNTIME_mat_alloc( size_t size)
+{
+    return malloc(size);
+}
+
+void RUNTIME_mat_free( void *mat, size_t size)
+{
+    (void)size;
+    free(mat);
+    return;
+}
+
 struct morse_parsec_desc_s {
     dague_ddesc_t  super;
     MORSE_desc_t  *desc;
diff --git a/runtime/quark/control/runtime_descriptor.c b/runtime/quark/control/runtime_descriptor.c
index 0044b6e2731d4e34411caeab2451ebdf8b569f7b..c16000fd484320ded6548c4b7a009c3cbf7fcb7c 100644
--- a/runtime/quark/control/runtime_descriptor.c
+++ b/runtime/quark/control/runtime_descriptor.c
@@ -4,7 +4,7 @@
  *                          of Tennessee Research Foundation.
  *                          All rights reserved.
  * @copyright (c) 2012-2014 Inria. All rights reserved.
- * @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved.
+ * @copyright (c) 2012-2014, 2016 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved.
  *
  **/
 
@@ -25,6 +25,18 @@
 #include <stdlib.h>
 #include "runtime/quark/include/morse_quark.h"
 
+void *RUNTIME_mat_alloc( size_t size)
+{
+    return malloc(size);
+}
+
+void RUNTIME_mat_free( void *mat, size_t size)
+{
+    (void)size;
+    free(mat);
+    return;
+}
+
 void RUNTIME_desc_init( MORSE_desc_t *desc )
 {
     (void)desc;
diff --git a/runtime/starpu/control/runtime_descriptor.c b/runtime/starpu/control/runtime_descriptor.c
index 2770264845bb180d64549faa90fa9afa35ce9e3d..b7926f2ae885b5c9cccc4876c3c5c1c4aeddd0a8 100644
--- a/runtime/starpu/control/runtime_descriptor.c
+++ b/runtime/starpu/control/runtime_descriptor.c
@@ -4,7 +4,7 @@
  *                          of Tennessee Research Foundation.
  *                          All rights reserved.
  * @copyright (c) 2012-2014 Inria. All rights reserved.
- * @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved.
+ * @copyright (c) 2012-2014, 2016 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved.
  *
  **/
 
@@ -43,6 +43,34 @@ static int tag_sep   = 24;
 
 #endif
 
+#ifdef STARPU_MALLOC_SIMULATION_FOLDED
+#define FOLDED STARPU_MALLOC_SIMULATION_FOLDED
+#else
+#define FOLDED 0
+#endif
+
+void *RUNTIME_mat_alloc( size_t size)
+{
+#if defined(CHAMELEON_SIMULATION) && !defined(STARPU_MALLOC_SIMULATION_FOLDED) && !defined(CHAMELEON_USE_MPI)
+    return (void*) 1;
+#else
+    void *mat;
+
+    if (starpu_malloc_flags(&mat, size, STARPU_MALLOC_PINNED|FOLDED) != 0)
+        return NULL;
+    return mat;
+#endif
+}
+
+void RUNTIME_mat_free( void *mat, size_t size)
+{
+#if defined(CHAMELEON_SIMULATION) && !defined(STARPU_MALLOC_SIMULATION_FOLDED) && !defined(CHAMELEON_USE_MPI)
+    return (void*) 1;
+#else
+    starpu_free_flags(mat, size, STARPU_MALLOC_PINNED|FOLDED);
+#endif
+}
+
 void RUNTIME_desc_create( MORSE_desc_t *desc )
 {
     int64_t lmt = desc->lmt;