diff --git a/control/descriptor.c b/control/descriptor.c
index 2a23650bb0a7e1d5be0f79765e30912c133105c1..7bb2f2ff1cbbc4ff52cf1638df1fbad46375e0f5 100644
--- a/control/descriptor.c
+++ b/control/descriptor.c
@@ -987,24 +987,38 @@ static void
 chameleon_desc_print( const CHAM_desc_t *desc, int shift )
 {
     intptr_t base = (intptr_t)desc->mat;
-    int m, n;
+    int m, n, rank;
+    CHAM_context_t *chamctxt = chameleon_context_self();
+
+    rank = CHAMELEON_Comm_rank();
 
     for ( n=0; n<desc->nt; n++ ) {
         for ( m=0; m<desc->mt; m++ ) {
             const CHAM_tile_t *tile;
             const CHAM_desc_t *tiledesc;
             intptr_t ptr;
+            int      trank;
 
+            trank    = desc->get_rankof( desc, m, n );
             tile     = desc->get_blktile( desc, m, n );
             tiledesc = tile->mat;
 
             ptr = ( tile->format == CHAMELEON_TILE_DESC ) ? (intptr_t)(tiledesc->mat) : (intptr_t)(tile->mat);
 
-            fprintf( stdout, "%*s%s(%3d,%3d): %d * %d / ld = %d / offset= %ld\n",
-                     shift, " ", desc->name, m, n, tile->m, tile->n, tile->ld, ptr - base );
+            if ( trank == rank ) {
+                fprintf( stdout, "[%2d]%*s%s(%3d,%3d): %d * %d / ld = %d / offset= %ld\n",
+                         rank, shift, " ", desc->name, m, n, tile->m, tile->n, tile->ld, ptr - base );
 
-            if ( tile->format == CHAMELEON_TILE_DESC ) {
-                chameleon_desc_print( tiledesc, shift+2 );
+                if ( tile->format == CHAMELEON_TILE_DESC ) {
+                    chameleon_desc_print( tiledesc, shift+2 );
+                }
+            }
+            else {
+                assert( ptr == 0 );
+            }
+
+            if ( chamctxt->scheduler != RUNTIME_SCHED_OPENMP ) {
+                RUNTIME_barrier(chamctxt);
             }
         }
     }
diff --git a/control/descriptor_rec.c b/control/descriptor_rec.c
index 496a4f4a0ae403ab357c012510123443eb1d3d2e..78634600e9b4a8443d938eb574d349256b8dd69a 100644
--- a/control/descriptor_rec.c
+++ b/control/descriptor_rec.c
@@ -29,9 +29,22 @@ chameleon_recdesc_create( const char *name, CHAM_desc_t **descptr, void *mat, ch
                           int lm, int ln, int m, int n, int p, int q,
                           blkaddr_fct_t get_blkaddr, blkldd_fct_t get_blkldd, blkrankof_fct_t get_rankof )
 {
-    CHAM_desc_t *desc;
+    CHAM_context_t *chamctxt;
+    CHAM_desc_t    *desc;
     int rc;
 
+    *descptr = NULL;
+
+    chamctxt = chameleon_context_self();
+    if ( chamctxt == NULL ) {
+        chameleon_error( "CHAMELEON_Recursive_Desc_Create", "CHAMELEON not initialized" );
+        return CHAMELEON_ERR_NOT_INITIALIZED;
+    }
+    if ( chamctxt->scheduler != RUNTIME_SCHED_STARPU ) {
+        chameleon_error( "CHAMELEON_Recursive_Desc_Create", "CHAMELEON Recursive descriptors only available with StaRPU" );
+        return CHAMELEON_ERR_NOT_INITIALIZED;
+    }
+
     /* Let's make sure we have at least one couple (mb, nb) defined */
     assert( (mb[0] > 0) && (nb[0] > 0) );
 
diff --git a/testing/testing_zprint.c b/testing/testing_zprint.c
index ae489df40c54470faa418ace53693d108dccc8b8..9b571e359c0fa37d63baa7adca97b10257be8bce 100644
--- a/testing/testing_zprint.c
+++ b/testing/testing_zprint.c
@@ -52,7 +52,7 @@ chameleon_getblkldd_cm( const CHAM_desc_t *A, int m )
 int
 testing_zprint( run_arg_list_t *args, int check )
 {
-    int hres = 0;
+    int rc, hres = 0;
 
     /* Read arguments */
     intptr_t mtxfmt    = parameters_getvalue_int( "mtxfmt" );
@@ -73,38 +73,57 @@ testing_zprint( run_arg_list_t *args, int check )
     CHAMELEON_Set( CHAMELEON_TILE_SIZE, nb );
 
     fprintf( stdout, "--- Tile layout ---\n" );
-    CHAMELEON_Desc_Create(
+    rc = CHAMELEON_Desc_Create(
         &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, M, N, P, Q );
 
-    CHAMELEON_Desc_Print( descA );
+    if ( rc == CHAMELEON_SUCCESS ) {
+        CHAMELEON_Desc_Print( descA );
+    }
+    else {
+        fprintf( stdout, "--- Tile layout (FAILED)---\n" );
+        hres++;
+    }
 
     CHAMELEON_Desc_Destroy( &descA );
 
-    fprintf( stdout, "--- Lapacke layout ---\n" );
-    CHAMELEON_Desc_Create_User(
+    fprintf( stdout, "--- Lapack layout ---\n" );
+    rc = CHAMELEON_Desc_Create_User(
         &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, M, N, P, Q,
         chameleon_getaddr_cm, chameleon_getblkldd_cm, NULL );
 
-    CHAMELEON_Desc_Print( descA );
+    if ( rc == CHAMELEON_SUCCESS ) {
+        CHAMELEON_Desc_Print( descA );
+    }
+    else {
+        fprintf( stdout, "--- Lapack layout (FAILED)---\n" );
+        hres++;
+    }
     CHAMELEON_Desc_Destroy( &descA );
 
-    fprintf( stdout, "--- Recursive layout (Tile)---\n" );
-    CHAMELEON_Recursive_Desc_Create(
-        &descA, CHAMELEON_MAT_ALLOC_GLOBAL, ChamComplexDouble,
-        list_nb, list_nb, LDA, N, M, N, P, Q,
-        NULL, NULL, NULL );
-
-    CHAMELEON_Desc_Print( descA );
-    CHAMELEON_Desc_Destroy( &descA );
-
-    fprintf( stdout, "--- Recursive layout (Lapack) ---\n" );
-    CHAMELEON_Recursive_Desc_Create(
-        &descA, CHAMELEON_MAT_ALLOC_GLOBAL, ChamComplexDouble,
-        list_nb, list_nb, LDA, N, M, N, P, Q,
-        chameleon_getaddr_cm, chameleon_getblkldd_cm, NULL );
-
-    CHAMELEON_Desc_Print( descA );
-    CHAMELEON_Desc_Destroy( &descA );
+    if ( CHAMELEON_Comm_size() == 0 )
+    {
+        fprintf( stdout, "--- Recursive layout (Tile)---\n" );
+        rc = CHAMELEON_Recursive_Desc_Create(
+            &descA, CHAMELEON_MAT_ALLOC_GLOBAL, ChamComplexDouble,
+            list_nb, list_nb, LDA, N, M, N, P, Q,
+            NULL, NULL, NULL );
+
+        if ( rc == CHAMELEON_SUCCESS ) {
+            CHAMELEON_Desc_Print( descA );
+        }
+        CHAMELEON_Desc_Destroy( &descA );
+
+        fprintf( stdout, "--- Recursive layout (Lapack) ---\n" );
+        rc = CHAMELEON_Recursive_Desc_Create(
+            &descA, CHAMELEON_MAT_ALLOC_GLOBAL, ChamComplexDouble,
+            list_nb, list_nb, LDA, N, M, N, P, Q,
+            chameleon_getaddr_cm, chameleon_getblkldd_cm, NULL );
+
+        if ( rc == CHAMELEON_SUCCESS ) {
+            CHAMELEON_Desc_Print( descA );
+        }
+        CHAMELEON_Desc_Destroy( &descA );
+    }
 
     run_arg_add_fixdbl( args, "time", 1. );
     run_arg_add_fixdbl( args, "gflops", 1. );