Index: soft/giet_vm/applications/display/display.c
===================================================================
--- soft/giet_vm/applications/display/display.c	(revision 723)
+++ soft/giet_vm/applications/display/display.c	(revision 724)
@@ -66,12 +66,13 @@
     giet_fbf_alloc();
 
-    // get a Chained Buffer DMA channel
-    giet_fbf_cma_alloc();
+    // get a Chained Buffer DMA channel for two user buffers
+    giet_fbf_cma_alloc( 2 );
 
-    // initialize the source and destination chbufs
-    giet_fbf_cma_init_buf( buf0 , buf1 , sts0 , sts1 );
+    // register the two user buffers
+    giet_fbf_cma_init_buf( 0 , buf0 , sts0 );
+    giet_fbf_cma_init_buf( 1 , buf1 , sts1 );
 
-    // start Chained Buffer DMA channel
-    giet_fbf_cma_start( NPIXELS*NLINES );
+    // start CMA peripheral 
+    giet_fbf_cma_start();
     
     giet_tty_printf("\n[DISPLAY] Proc[%d,%d,%d] starts CMA at cycle %d\n", 
@@ -81,16 +82,11 @@
     while ( 1 )
     {
-        // load buf0
-        giet_fat_read( fd, buf0, NPIXELS*NLINES );
-
-        giet_tty_printf("\n[DISPLAY] Proc[%d,%d,%d] load image %d at cycle %d\n", 
-                        x, y, p, image, giet_proctime() );
-
-        // display buf0
-        giet_fbf_cma_display( 0 );
+        //////   handling buf0
+        giet_fbf_cma_check( 0 );                       // check buf0 empty
+        giet_fat_read( fd, buf0, NPIXELS*NLINES );     // load buf0 from disk
+        giet_fbf_cma_display( 0 );                     // display buf0
 
         giet_tty_printf("\n[DISPLAY] Proc[%d,%d,%d] display image %d at cycle %d\n", 
                         x, y, p, image, giet_proctime() );
-
         image++;
 
@@ -98,21 +94,16 @@
         {
             image = 0;
-            giet_fat_lseek( fd , 0 , 0 );
+            giet_fat_lseek( fd , 0 , SEEK_SET );
         }
 
         if ( INTERACTIVE ) giet_tty_getc( &byte );
 
-        // load buf1
-        giet_fat_read( fd, buf1, NPIXELS*NLINES );
-
-        giet_tty_printf("\n[DISPLAY] Proc[%d,%d,%d] load image %d at cycle %d\n", 
-                        x, y, p, image, giet_proctime() );
-
-        // display buf1
-        giet_fbf_cma_display( 1 );
+        //////   handling buf1
+        giet_fbf_cma_check( 1 );                       // check buf1 empty
+        giet_fat_read( fd, buf1, NPIXELS*NLINES );     // load buf1 from disk
+        giet_fbf_cma_display( 1 );                     // display buf1
 
         giet_tty_printf("\n[DISPLAY] Proc[%d,%d,%d] display image %d at cycle %d\n", 
                         x, y, p, image, giet_proctime() );
-
         image++;
 
@@ -120,5 +111,5 @@
         {
             image = 0;
-            giet_fat_lseek( fd , 0 , 0 );
+            giet_fat_lseek( fd , 0 , SEEK_SET );
         }
 
Index: soft/giet_vm/applications/display/display.py
===================================================================
--- soft/giet_vm/applications/display/display.py	(revision 723)
+++ soft/giet_vm/applications/display/display.py	(revision 724)
@@ -22,5 +22,5 @@
     x = 0
     y = 0
-    p = 2
+    p = 0
 
     # define vsegs base & size
Index: soft/giet_vm/applications/gameoflife/gameoflife.c
===================================================================
--- soft/giet_vm/applications/gameoflife/gameoflife.c	(revision 723)
+++ soft/giet_vm/applications/gameoflife/gameoflife.c	(revision 724)
@@ -260,15 +260,13 @@
    giet_fbf_alloc();
 
-   // get a Chained Buffer DMA channel
-   giet_fbf_cma_alloc();
-
-   // initializes the source and destination buffers
-   giet_fbf_cma_init_buf( &display[0][0][0] , 
-                          &display[1][0][0] , 
-                          status0 ,
-                          status1 );
+   // get a CMA channel for two user buffers
+   giet_fbf_cma_alloc( 2 );
+
+   // register the user buffers
+   giet_fbf_cma_init_buf( 0 , &display[0][0][0] , status0 );
+   giet_fbf_cma_init_buf( 1 , &display[1][0][0] , status1 );
 
    // activates CMA channel
-   giet_fbf_cma_start( height * width );
+   giet_fbf_cma_start();
 
    // initializes distributed heap
Index: soft/giet_vm/applications/raycast/disp.c
===================================================================
--- soft/giet_vm/applications/raycast/disp.c	(revision 723)
+++ soft/giet_vm/applications/raycast/disp.c	(revision 724)
@@ -19,7 +19,6 @@
 
 extern unsigned char*  g_tex[5];
-extern unsigned char*  buf[2];
-extern void*           sts[2];
-extern unsigned int    cur_buf;
+extern unsigned char*  buf;
+extern void*           sts;
 extern unsigned int    slice_x;
 extern unsigned int    slice_count;
@@ -38,9 +37,10 @@
     int ymax = (y1 < FBUF_Y_SIZE ? y1 : FBUF_Y_SIZE);
 
-    for (; y < ymax; y++) {
+    for (; y < ymax; y++) 
+    {
         // Find texture coordinate
         int ty = (y - y0) * TEX_SIZE / (y1 - y0);
 
-        buf[cur_buf][y * FBUF_X_SIZE + x] = line[ty];
+        buf[y * FBUF_X_SIZE + x] = line[ty];
     }
 }
@@ -52,6 +52,7 @@
     int ymax = (y1 < FBUF_Y_SIZE ? y1 : FBUF_Y_SIZE);
 
-    for (; y < ymax; y++) {
-        buf[cur_buf][y * FBUF_X_SIZE + x] = color;
+    for (; y < ymax; y++) 
+    {
+        buf[y * FBUF_X_SIZE + x] = color;
     }
 }
Index: soft/giet_vm/applications/raycast/raycast.c
===================================================================
--- soft/giet_vm/applications/raycast/raycast.c	(revision 723)
+++ soft/giet_vm/applications/raycast/raycast.c	(revision 724)
@@ -9,7 +9,6 @@
 ///////////////////////
 
-unsigned char*           buf[2];             // one image per buffer
-void *                   sts[2];             // for fbf_cma
-unsigned int             cur_buf;            // current buffer
+unsigned char*           buf;                // one image buffer
+void *                   sts;                // buffer status
 volatile unsigned int    slice_x;            // slice index (shared)
 volatile unsigned int    slice_count;        // slice count (shared)
@@ -84,16 +83,19 @@
     sqt_lock_init( &slice_done_lock, w , h , p );
 
-    // Allocate buffers
-    buf[0] = malloc(FBUF_X_SIZE * FBUF_Y_SIZE);
-    buf[1] = malloc(FBUF_X_SIZE * FBUF_Y_SIZE);
-    sts[0] = malloc(64);
-    sts[1] = malloc(64);
+    // Allocate buffer and status for CMA
+    buf = malloc(FBUF_X_SIZE * FBUF_Y_SIZE);
+    sts = malloc(64);
 
-    // Initialize frame buffer and start Chained buffer DMA
+    // Get frame buffer ownership
     giet_fbf_alloc();
-    giet_fbf_cma_alloc();
-    giet_fbf_cma_init_buf(buf[0], buf[1], sts[0], sts[1]);
-    giet_fbf_cma_start(FBUF_X_SIZE * FBUF_Y_SIZE);
-    cur_buf = 0;
+    
+    // Get a CMA channel for one single user buffer
+    giet_fbf_cma_alloc( 1 );
+    
+    // Register the user buffer and status
+    giet_fbf_cma_init_buf( 0 , buf , sts );
+
+    // Start Chained buffer DMA
+    giet_fbf_cma_start();
 
     // Load textures
@@ -122,16 +124,17 @@
     }
 
-
-
     // Game main loop : display one frame 
     // and get one player move per iteration
     while ( game.exit == 0 ) 
     {
-        // initialise synchronisation variables
-        // this actually allows the render threads to make useful work
+        // check user buffer empty
+        giet_fbf_cma_check( 0 );
+
+        // re-initialise synchronisation variables 
+        // to start parallel synthesis
         slice_count = 0;
         slice_x     = 0;
 
-        // contribute to build current buffer
+        // contribute to synthesis 
         unsigned int slice;
         while ( dispRenderSlice( &slice ) );
@@ -140,7 +143,6 @@
         while (slice_count < FBUF_X_SIZE)  giet_tty_printf(" ");
 
-        // Flip buffer
-        giet_fbf_cma_display(cur_buf);
-        cur_buf = 1 - cur_buf;
+        // display image
+        giet_fbf_cma_display( 0 );
 
         // get new player position [x,y,dir]
