diff --git a/c_gtk_image/c_gtk_image.cpp b/c_gtk_image/c_gtk_image.cpp
index 41365f6e14c834695c8e3cd95c2697004a623fb5..e5d4a4886b00162d4bfe1c4bfe53e41e3dfb73eb 100644
--- a/c_gtk_image/c_gtk_image.cpp
+++ b/c_gtk_image/c_gtk_image.cpp
@@ -17,15 +17,16 @@ using namespace std;
 
 float min_val, max_val;
 
-const char *channel_name, *fullscreen_option, *keyboard_mode;
+
+const char *channel_name, *fullscreen_option, *keyboard_mode, *address, *port_name;
 GtkWidget *window;
 GdkDisplay *main_display;
 GdkDevice *pointer_device;
 int interactive_mode=0;
 GtkApplication *app;
 
-blc_channel mouse_channel;
-blc_channel input;
+blc_array mouse_array;
+blc_array input;
 
 char const *input_name;
 
@@ -61,20 +62,21 @@ void activate_cb(GApplication *app)
 {
     GtkWidget *display=nullptr;
     GtkWidget *grid;
+    string title(string(address)+":"+string(port_name));
     
     main_display = gdk_display_get_default ();
     GdkDeviceManager *device_manager = gdk_display_get_device_manager (main_display);
     pointer_device = gdk_device_manager_get_client_pointer (device_manager);
     
     window=gtk_application_window_new(GTK_APPLICATION(app));
-    gtk_window_set_title(GTK_WINDOW(window), input.name);
+    gtk_window_set_title(GTK_WINDOW(window), title.c_str());
     
     grid=gtk_grid_new();
     
     //  for(i=0; input_names[i]; i++){ This is for displaying multiple images
     //  input=new blc_channel(/*input_names[i]*/ input_name, BLC_CHANNEL_READ);
     display=create_image_display(&input);
-    if (display==NULL) EXIT_ON_CHANNEL_ERROR(&input, "Format not managed.");
+    if (display==NULL) EXIT_ON_ARRAY_ERROR(&input, "Format not managed.");
     gtk_widget_set_hexpand(display, 1);
     gtk_widget_set_vexpand(display, 1);
     gtk_container_add(GTK_CONTAINER(grid), display);
@@ -99,11 +101,13 @@ int main(int argc, char *argv[])
     blc_program_add_option(&max_str, 'M', "max", "FL32", "maximal value", nullptr);
     blc_program_add_option(&fullscreen_option, 'F', "fullscreen", nullptr, "Set the window in fullscreen", nullptr);
     blc_program_add_option(&g_debug, 'g', "g-fatal-warnings", nullptr, "Debug gtk.", nullptr);
+    blc_program_add_parameter(&address, "address", 1, "internet address", "localhost");
+    blc_program_add_parameter(&port_name, "port", 1, "port name", "31440");
     
     blc_program_init(&argc, &argv, ask_quit);
     blc_command_forward_blc_channels();
 
-    blc_array_tcp4_client input_client(&input, "127.0.0.1", "31440");
+    blc_array_tcp4_client input_client(&input, address, port_name);
     input.allocate();
     fprintf(stderr, "Connecté\n");
         
@@ -123,7 +127,9 @@ int main(int argc, char *argv[])
     
 
     thread input_thread([&input_client](){
-        while(1) input_client.read_data();
+        while(1) {
+            input_client.read_data();
+        }
     });
 
     gtk_disable_setlocale();
@@ -133,6 +139,7 @@ int main(int argc, char *argv[])
     status = g_application_run(G_APPLICATION(app), 0, nullptr);
     g_object_unref(app);
     
+    input_thread.join();
     return EXIT_SUCCESS;
 }
 
diff --git a/include/common.h b/include/common.h
index 018935268a85ae83fbf09c5b389c5d728bf834ce..880b852e20e294de4bbaf9e5c2546861dc6e81bb 100644
--- a/include/common.h
+++ b/include/common.h
@@ -2,12 +2,12 @@
 #define COMMON_H
 
 #include <gtk/gtk.h>
-#include <blc_channel.h>
+#include <blc_core.h>
 
 
 extern float min_val, max_val;
 
-extern blc_channel *channel;
+extern blc_array *array;
 extern GtkWidget *legend;
 
 extern u_int32_t false_colors[256];
@@ -21,14 +21,14 @@ extern uint32_t *color_map;
 
 extern GtkWidget *window, *paned;
 extern GdkDevice *pointer_device;
-extern blc_channel mouse_channel;
+extern blc_array mouse_array;
 
 extern char const *fullscreen_option;
 
 
 
 void histogram_cb(GtkToolButton *toolbutton, gpointer pointer_statusbar );
-GtkWidget *create_image_display(blc_channel *channel);
+GtkWidget *create_image_display(blc_array *array);
 
 #endif
 
diff --git a/o_gtk_image/o_gtk_image.cpp b/o_gtk_image/o_gtk_image.cpp
index cc73094d11b38fdbca764d9b351050527fb7ebec..146b84290504f72a843f6537177155c6baf00258 100644
--- a/o_gtk_image/o_gtk_image.cpp
+++ b/o_gtk_image/o_gtk_image.cpp
@@ -18,7 +18,7 @@ GdkDisplay *main_display;
 GdkDevice *pointer_device;
 int interactive_mode=0;
 GtkApplication *app;
-blc_channel mouse_channel;
+blc_array mouse_array;
 
 blc_channel input;
 
@@ -68,6 +68,9 @@ void activate_cb(GApplication *app)
     
     //  for(i=0; input_names[i]; i++){ This is for displaying multiple images
     //  input=new blc_channel(/*input_names[i]*/ input_name, BLC_CHANNEL_READ);
+    blc_loop_try_add_posting_semaphore(input.sem_ack_data);
+    blc_loop_try_add_waiting_semaphore(input.sem_new_data);
+    
     display=create_image_display(&input);
     if (display==NULL) EXIT_ON_CHANNEL_ERROR(&input, "Format not managed.");
     gtk_widget_set_hexpand(display, 1);
diff --git a/src/histogram.cpp b/src/histogram.cpp
index 1591a40605e2e7b13d914f1392b2f9662b332f3c..76871eeb2ef0c481bb16ae10576946ebafbade57 100644
--- a/src/histogram.cpp
+++ b/src/histogram.cpp
@@ -43,11 +43,11 @@ static gboolean update_histogram_cb(GtkImage *image, GdkFrameClock *, gpointer p
     x*=sx;
     y*=sy;
     
-    switch (channel->format){
+    switch (array->format){
         case 'Y800':
-            switch (channel->type){
+            switch (array->type){
                 case 'UIN8':
-                    FOR(i, channel->size) histogram[channel->uchars[i]]++;
+                    FOR(i, array->size) histogram[array->uchars[i]]++;
                     FOR(i, 256) hist_max=MAX(histogram[i], hist_max);
                     
                     FOR(i, 256)
@@ -58,12 +58,12 @@ static gboolean update_histogram_cb(GtkImage *image, GdkFrameClock *, gpointer p
                 }
                     if (y>=0 && y<256 && x >=0 && x<256)
                     {
-                        SPRINTF(text, "Y[%d]=%f.2%%", x, histogram[x]*100/(float)channel->size);
+                        SPRINTF(text, "Y[%d]=%f.2%%", x, histogram[x]*100/(float)array->size);
                         gtk_statusbar_push(GTK_STATUSBAR(pointer_statusbar), 0, text);
                     }
                     break;
                 case 'FL32':
-                    FOR(i, channel->total_length) histogram[(int)CLIP_UCHAR(((channel->floats[i]-min_val)/(max_val-min_val)*256+0.5))]++;
+                    FOR(i, array->total_length) histogram[(int)CLIP_UCHAR(((array->floats[i]-min_val)/(max_val-min_val)*256+0.5))]++;
                     FOR(i, 256) hist_max=MAX(histogram[i], hist_max);
                     FOR(i, 256)
                 {
@@ -73,18 +73,18 @@ static gboolean update_histogram_cb(GtkImage *image, GdkFrameClock *, gpointer p
                 }
                     if (y>=0 && y<256 && x >=0 && x<256)
                     {
-                        SPRINTF(text, "Y[%f]=%f.2%%", x*(max_val-min_val-0.5)/256+min_val, histogram[x]*100/(float)channel->total_length);
+                        SPRINTF(text, "Y[%f]=%f.2%%", x*(max_val-min_val-0.5)/256+min_val, histogram[x]*100/(float)array->total_length);
                         gtk_statusbar_push(GTK_STATUSBAR(pointer_statusbar), 0, text);
                     }
                     break;
-                default: EXIT_ON_ARRAY_ERROR( channel, "Type not managed for format 'Y800'. Only 'UIN8' is");
+                default: EXIT_ON_ARRAY_ERROR( array, "Type not managed for format 'Y800'. Only 'UIN8' is");
             }
             break;
         case 'RGB3':
-            FOR_INV(i, channel->size/3){
-                histogram[channel->uchars[i*3]]++;
-                histogram1[channel->uchars[i*3+1]]++;
-                histogram2[channel->uchars[i*3+2]]++;
+            FOR_INV(i, array->size/3){
+                histogram[array->uchars[i*3]]++;
+                histogram1[array->uchars[i*3+1]]++;
+                histogram2[array->uchars[i*3+2]]++;
             }
             
             FOR_INV(i, 256)
@@ -99,17 +99,17 @@ static gboolean update_histogram_cb(GtkImage *image, GdkFrameClock *, gpointer p
             
             if (y>=0 && y<256 && x >=0 && x<256)
             {
-                if (y<85)  SPRINTF(text, "R[%d]=%f.2%%", x, histogram[x]*100*2/(float)channel->size);
-                else if (y<170)  SPRINTF(text, "G[%d]=%.2f%%", x, histogram1[x]*100*4/(float)channel->size);
-                else  SPRINTF(text, "B[%d]=%.2f%%", x, histogram2[x]*100*4/(float)channel->size);
+                if (y<85)  SPRINTF(text, "R[%d]=%f.2%%", x, histogram[x]*100*2/(float)array->size);
+                else if (y<170)  SPRINTF(text, "G[%d]=%.2f%%", x, histogram1[x]*100*4/(float)array->size);
+                else  SPRINTF(text, "B[%d]=%.2f%%", x, histogram2[x]*100*4/(float)array->size);
                 gtk_statusbar_push(GTK_STATUSBAR(pointer_statusbar), 0, text);
             }
             
             break;
         case 'YUYV':
-            for(i=channel->size-2;i!=-1;i-=2) histogram[channel->uchars[i]]++;
-            for(i=channel->size-1;i!=-2;i-=4) histogram1[channel->uchars[i]]++;
-            for(i=channel->size-3;i!=-4;i-=4) histogram2[channel->uchars[i]]++;
+            for(i=array->size-2;i!=-1;i-=2) histogram[array->uchars[i]]++;
+            for(i=array->size-1;i!=-2;i-=4) histogram1[array->uchars[i]]++;
+            for(i=array->size-3;i!=-4;i-=4) histogram2[array->uchars[i]]++;
             
             FOR_INV(i, 256)
         {
@@ -124,16 +124,16 @@ static gboolean update_histogram_cb(GtkImage *image, GdkFrameClock *, gpointer p
             
             if (y>=0 && y<256 && x >=0 && x<256)
             {
-                if (y<128)  SPRINTF(text, "Y[%d]=%f.2%%", x, histogram[x]*100*2/(float)channel->size);
-                else if (y<192)  SPRINTF(text, "U[%d]=%.2f%%", x, histogram1[x]*100*4/(float)channel->size);
-                else  SPRINTF(text, "V[%d]=%.2f%%", x, histogram2[x]*100*4/(float)channel->size);
+                if (y<128)  SPRINTF(text, "Y[%d]=%f.2%%", x, histogram[x]*100*2/(float)array->size);
+                else if (y<192)  SPRINTF(text, "U[%d]=%.2f%%", x, histogram1[x]*100*4/(float)array->size);
+                else  SPRINTF(text, "V[%d]=%.2f%%", x, histogram2[x]*100*4/(float)array->size);
                 gtk_statusbar_push(GTK_STATUSBAR(pointer_statusbar), 0, text);
             }
             break;
         case 'yuv2':
-            for(i=channel->size-1;i!=-1;i-=2) histogram[channel->uchars[i]]++;
-            for(i=channel->size-2;i!=-2;i-=4) histogram1[channel->uchars[i]]++;
-            for(i=channel->size-4;i!=-4;i-=4) histogram2[channel->uchars[i]]++;
+            for(i=array->size-1;i!=-1;i-=2) histogram[array->uchars[i]]++;
+            for(i=array->size-2;i!=-2;i-=4) histogram1[array->uchars[i]]++;
+            for(i=array->size-4;i!=-4;i-=4) histogram2[array->uchars[i]]++;
             
             FOR_INV(i, 256)
         {
@@ -148,9 +148,9 @@ static gboolean update_histogram_cb(GtkImage *image, GdkFrameClock *, gpointer p
             
             if (y>=0 && y<256 && x >=0 && x<256)
             {
-                if (y<128)  SPRINTF(text, "Y[%d]=%f.2%%", x, histogram[x]*100*2/(float)channel->size);
-                else if (y<192)  SPRINTF(text, "U[%d]=%.2f%%", x, histogram1[x]*100*4/(float)channel->size);
-                else  SPRINTF(text, "V[%d]=%.2f%%", x, histogram2[x]*100*4/(float)channel->size);
+                if (y<128)  SPRINTF(text, "Y[%d]=%f.2%%", x, histogram[x]*100*2/(float)array->size);
+                else if (y<192)  SPRINTF(text, "U[%d]=%.2f%%", x, histogram1[x]*100*4/(float)array->size);
+                else  SPRINTF(text, "V[%d]=%.2f%%", x, histogram2[x]*100*4/(float)array->size);
                 gtk_statusbar_push(GTK_STATUSBAR(pointer_statusbar), 0, text);
                 
             }
diff --git a/src/image_display.cpp b/src/image_display.cpp
index 959a493f8cdcfe4a8bc7da2be3fb97949cbd3e3e..c523d33108b4293c9822802f2dbf620c5dcc150c 100644
--- a/src/image_display.cpp
+++ b/src/image_display.cpp
@@ -44,7 +44,7 @@ double zoom_in_factor=2, zoom_out_factor=0.5;
 GtkWidget *legend=NULL;
 
 static int width=0, height=0;
-blc_channel *channel=NULL;
+blc_array *array=NULL;
 
 static int g_source_continue=G_SOURCE_CONTINUE;
 
@@ -172,11 +172,11 @@ gboolean update_Y800_image(GtkImage *image, GdkFrameClock *, gpointer pointer_st
     
     if (blc_command_loop_start()){
         values = (uint32_t*)image_buffer;
-        if (channel->type=='UIN8')
-            FOR(i, channel->size) values[i]=color_map[channel->uchars[i]];
-        else if (channel->type=='FL32')
-            FOR(i, channel->total_length) values[i]=color_map[CLIP_UCHAR((channel->floats[i]-min_val)*256*gain-0.5f)];
-        else EXIT_ON_ARRAY_ERROR(channel, "Type not managed");
+        if (array->type=='UIN8')
+            FOR(i, array->size) values[i]=color_map[array->uchars[i]];
+        else if (array->type=='FL32')
+            FOR(i, array->total_length) values[i]=color_map[CLIP_UCHAR((array->floats[i]-min_val)*256*gain-0.5f)];
+        else EXIT_ON_ARRAY_ERROR(array, "Type not managed");
         gtk_image_set_from_surface(image, image_surface);
         
         gdk_window_get_device_position(gtk_widget_get_window(GTK_WIDGET(image)), pointer_device, &x, &y, NULL);
@@ -184,8 +184,8 @@ gboolean update_Y800_image(GtkImage *image, GdkFrameClock *, gpointer pointer_st
         i=x*sx;
         j=y*sy;
         if (i<width && j<height && i>=0 && j>=0){
-            if (channel->type=='UIN8')  SPRINTF(text, "%4d,%4d: Y:%3d", i,j, channel->uchars[i+j*width]);
-            else if (channel->type=='FL32')  SPRINTF(text, "%4d,%4d: Y:%.3f", i,j, channel->floats[i+j*width]);
+            if (array->type=='UIN8')  SPRINTF(text, "%4d,%4d: Y:%3d", i,j, array->uchars[i+j*width]);
+            else if (array->type=='FL32')  SPRINTF(text, "%4d,%4d: Y:%.3f", i,j, array->floats[i+j*width]);
             gtk_statusbar_push(GTK_STATUSBAR(pointer_statusbar), 0, text);
         }
         iterations++;
@@ -205,10 +205,10 @@ gboolean update_RGB3_image(GtkImage *image, GdkFrameClock *, gpointer pointer_st
         gdk_window_get_device_position(gtk_widget_get_window(GTK_WIDGET(image)), pointer_device, &x, &y, NULL);
         cairo_surface_get_device_scale(image_surface, &sx, &sy);
         
-        while(i!=channel->size){
-            image_buffer[j++]=channel->uchars[i+2];
-            image_buffer[j++]=channel->uchars[i+1];
-            image_buffer[j++]=channel->uchars[i];
+        while(i!=array->size){
+            image_buffer[j++]=array->uchars[i+2];
+            image_buffer[j++]=array->uchars[i+1];
+            image_buffer[j++]=array->uchars[i];
             j++;
             i+=3;
         }
@@ -217,16 +217,16 @@ gboolean update_RGB3_image(GtkImage *image, GdkFrameClock *, gpointer pointer_st
         j=y*sy;
         
         if (i<width && j<height && i>=0 && j>=0){
-            if (mouse_channel.fd!=-1)
+            if (mouse_array.dims!=nullptr)
             {
-                mouse_channel.uints32[0]=i;
-                mouse_channel.uints32[1]=j;
-                gdk_device_get_state(pointer_device, gtk_widget_get_window(GTK_WIDGET(image)), NULL, (GdkModifierType*)(&mouse_channel.uints32[2]));
+                mouse_array.uints32[0]=i;
+                mouse_array.uints32[1]=j;
+                gdk_device_get_state(pointer_device, gtk_widget_get_window(GTK_WIDGET(image)), NULL, (GdkModifierType*)(&mouse_array.uints32[2]));
             }
             
-            R=channel->uchars[i*4+j*width*3];
-            G=channel->uchars[i*4+j*width*3+1];
-            B=channel->uchars[i*4+j*width*3+2];
+            R=array->uchars[i*4+j*width*3];
+            G=array->uchars[i*4+j*width*3+1];
+            B=array->uchars[i*4+j*width*3+2];
             SPRINTF(text, "%4d,%4d : R:%3d,G:%3d,B:%3d", i, j, R, G, B);
             
             gtk_statusbar_push(GTK_STATUSBAR(pointer_statusbar), 0, text);
@@ -252,22 +252,22 @@ gboolean update_RGBA_image(GtkImage *image, GdkFrameClock *, gpointer pointer_st
     gdk_window_get_device_position(gtk_widget_get_window(GTK_WIDGET(image)), pointer_device, &x, &y, NULL);
     cairo_surface_get_device_scale(image_surface, &sx, &sy);
     
-    FOR_INV(i, channel->size/4) ((uint32_t*)image_buffer)[i]=SWAP_RGBA_TO_CAIRO_ARGB32(channel->uints32[i]);
+    FOR_INV(i, array->size/4) ((uint32_t*)image_buffer)[i]=SWAP_RGBA_TO_CAIRO_ARGB32(array->uints32[i]);
     
     i=x*sx;
     j=y*sy;
     
     if (i<width && j<height && i>=0 && j>=0){
-        if (mouse_channel.fd!=-1){
-            mouse_channel.uints32[0]=i;
-            mouse_channel.uints32[1]=j;
-            gdk_device_get_state(pointer_device, gtk_widget_get_window(GTK_WIDGET(image)), NULL, (GdkModifierType*)(&mouse_channel.uints32[2]));
+        if (mouse_array.dims!=nullptr){
+            mouse_array.uints32[0]=i;
+            mouse_array.uints32[1]=j;
+            gdk_device_get_state(pointer_device, gtk_widget_get_window(GTK_WIDGET(image)), NULL, (GdkModifierType*)(&mouse_array.uints32[2]));
         }
         
-        R=channel->uchars[i*4+j*width*4];
-        G=channel->uchars[i*4+j*width*4+1];
-        B=channel->uchars[i*4+j*width*4+2];
-        A=channel->uchars[i*4+j*width*4+3];
+        R=array->uchars[i*4+j*width*4];
+        G=array->uchars[i*4+j*width*4+1];
+        B=array->uchars[i*4+j*width*4+2];
+        A=array->uchars[i*4+j*width*4+3];
         SPRINTF(text, "%4d,%4d: R:%d G:%d B:%d A:%d", i, j, R, G, B, A);
         
         gtk_statusbar_push(GTK_STATUSBAR(pointer_statusbar), 0, text);
@@ -286,7 +286,7 @@ void jpeg_error(j_common_ptr cinfo, int msg_level)
     cinfo->err->num_warnings++;
 }
 
-gboolean update_JPEG_image(GtkImage *image, GdkFrameClock *frame_clock, blc_channel *channel)
+gboolean update_JPEG_image(GtkImage *image, GdkFrameClock *frame_clock, blc_array *array)
 {
     JSAMPROW row_pt[1];
     GdkPixbuf *pixbuf;
@@ -305,7 +305,7 @@ gboolean update_JPEG_image(GtkImage *image, GdkFrameClock *frame_clock, blc_chan
     cinfo.err = jpeg_std_error(&jerr);
     cinfo.err->emit_message = jpeg_error;
     jpeg_create_decompress(&cinfo);
-    jpeg_mem_src(&cinfo, (uchar*) channel->data, channel->size);
+    jpeg_mem_src(&cinfo, (uchar*) array->data, array->size);
     jpeg_read_header(&cinfo, TRUE);
     jpeg_start_decompress(&cinfo);
     row_stride = cinfo.output_width * cinfo.output_components;
@@ -337,7 +337,7 @@ gboolean update_JPEG_image(GtkImage *image, GdkFrameClock *frame_clock, blc_chan
 gboolean update_YUYV_image(GtkImage *image, GdkFrameClock *frame_clock, void*)
 {
     int i, j;
-    uchar *data = (uchar*) channel->data;
+    uchar *data = (uchar*) array->data;
     uint32_t *pixels;
     int Y, Cb = 128, Cr = 128;
     
@@ -347,7 +347,7 @@ gboolean update_YUYV_image(GtkImage *image, GdkFrameClock *frame_clock, void*)
     
     pixels = (uint32_t*)image_buffer;
     i = 0;
-    while (i != (int) channel->size)
+    while (i != (int) array->size)
     {
         Y = data[i++];
         Cb = data[i++];
@@ -375,7 +375,7 @@ gboolean update_yuv2_image(GtkImage *image, GdkFrameClock *, gpointer pointer_st
     int x, y;
     int i, j;
     
-    uchar *data = (uchar*) channel->data;
+    uchar *data = (uchar*) array->data;
     char text[NAME_MAX];
     uint32_t *tmp_pixels;
     int Y, U = 128, V = 128;
@@ -385,7 +385,7 @@ gboolean update_yuv2_image(GtkImage *image, GdkFrameClock *, gpointer pointer_st
     tmp_pixels = (uint32_t*)image_buffer;
     i = 0;
     
-    while (i != (int) channel->size)
+    while (i != (int) array->size)
     {
         U = data[i++];
         Y = data[i++];
@@ -410,16 +410,16 @@ gboolean update_yuv2_image(GtkImage *image, GdkFrameClock *, gpointer pointer_st
     
     if (i<width && j<height && i>=0 && j>=0)
     {
-        if (mouse_channel.fd!=-1)
+        if (mouse_array.dims!=nullptr)
         {
-            mouse_channel.uints32[0]=i;
-            mouse_channel.uints32[1]=j;
-            gdk_device_get_state(pointer_device, gtk_widget_get_window(GTK_WIDGET(image)), NULL, (GdkModifierType*)(&mouse_channel.uints32[2]));
+            mouse_array.uints32[0]=i;
+            mouse_array.uints32[1]=j;
+            gdk_device_get_state(pointer_device, gtk_widget_get_window(GTK_WIDGET(image)), NULL, (GdkModifierType*)(&mouse_array.uints32[2]));
         }
         
-        Y=channel->uchars[i*2+j*width*2+1];
-        U=channel->uchars[i*4+j*width*2];
-        V=channel->uchars[i*4+j*width*2+2];
+        Y=array->uchars[i*2+j*width*2+1];
+        U=array->uchars[i*4+j*width*2];
+        V=array->uchars[i*4+j*width*2+2];
         SPRINTF(text, "%d,%d: Y:%d, U:%d, V:%d", i, j, Y, U, V);
         
         gtk_statusbar_push(GTK_STATUSBAR(pointer_statusbar), 0, text);
@@ -511,28 +511,25 @@ int frame_rate(gpointer data)
     return G_SOURCE_CONTINUE;
 }
 
-GtkWidget *create_image_display(blc_channel *tmp_channel)
+GtkWidget *create_image_display(blc_array *tmp_array)
 {
     GtkWidget  *pointer_statusbar, *framerate_statusbar;
     char label_text[NAME_MAX + 1];
     uint32_t type_string, format_string;
     
-    channel=tmp_channel;
+    array=tmp_array;
     toolbar = gtk_toolbar_new();
     general_statusbar=gtk_statusbar_new();
     framerate_statusbar=gtk_statusbar_new();
     pointer_statusbar=gtk_statusbar_new();
     
-    blc_loop_try_add_posting_semaphore(channel->sem_ack_data);
-    blc_loop_try_add_waiting_semaphore(channel->sem_new_data);
-    
     blc_command_loop_init(0);
-    switch (channel->format)
+    switch (array->format)
     {
         case 'NDEF':
         case 'Y800':
-            width=channel->dims[0].length;
-            height=channel->dims[1].length;
+            width=array->dims[0].length;
+            height=array->dims[1].length;
             image_buffer = MANY_ALLOCATIONS(width*height * 4, uchar);
             image_surface=cairo_image_surface_create_for_data(image_buffer, CAIRO_FORMAT_RGB24, width, height, width * 4);
             image=gtk_image_new_from_surface(image_surface);
@@ -540,25 +537,25 @@ GtkWidget *create_image_display(blc_channel *tmp_channel)
             false_colors_button=blgtk_add_toggle_tool_button(toolbar, "false\ncolors", "applications-graphics", G_CALLBACK(false_color_cb),  NULL);
             break;
         case 'BA81':
-            EXIT_ON_ARRAY_ERROR(channel, "format, Not fully implemented");
-            width=channel->dims[1].length;
-            height=channel->dims[2].length;
+            EXIT_ON_ARRAY_ERROR(array, "format, Not fully implemented");
+            width=array->dims[1].length;
+            height=array->dims[2].length;
             image_buffer = MANY_ALLOCATIONS(width*height * 4, uchar);
             image_surface=cairo_image_surface_create_for_data(image_buffer, CAIRO_FORMAT_RGB24, width, height, width * 4);
             image=gtk_image_new_from_surface(image_surface);
             gtk_widget_add_tick_callback(GTK_WIDGET(image), (GtkTickCallback) update_RGB3_image, &g_source_continue, NULL);
             break;
         case 'RGB3':
-            width=channel->dims[1].length;
-            height=channel->dims[2].length;
+            width=array->dims[1].length;
+            height=array->dims[2].length;
             image_buffer = MANY_ALLOCATIONS(width*height * 4, uchar);
             image_surface=cairo_image_surface_create_for_data(image_buffer, CAIRO_FORMAT_RGB24, width, height, width * 4);
             image=gtk_image_new_from_surface(image_surface);
             gtk_widget_add_tick_callback(GTK_WIDGET(image), (GtkTickCallback) update_RGB3_image, pointer_statusbar, NULL);
             break;
         case 'RGBA':
-            width=channel->dims[1].length;
-            height=channel->dims[2].length;
+            width=array->dims[1].length;
+            height=array->dims[2].length;
             image_buffer = MANY_ALLOCATIONS(width*height * 4, uchar);
             image_surface=cairo_image_surface_create_for_data(image_buffer, CAIRO_FORMAT_ARGB32, width, height, width * 4);
             image=gtk_image_new_from_surface(image_surface);
@@ -572,8 +569,8 @@ GtkWidget *create_image_display(blc_channel *tmp_channel)
              image = gtk_image_new_from_pixbuf(pixbuf);
              gtk_widget_add_tick_callback(image, (GtkTickCallback) update_JPEG_image, channel, NULL);*/
         case 'YUYV':
-            width=channel->dims[1].length;
-            height=channel->dims[2].length;
+            width=array->dims[1].length;
+            height=array->dims[2].length;
             image_buffer = MANY_ALLOCATIONS(width*height * 4, uchar); //In order to be sure that the rowstride will be 'gui.width * 3'
             image_surface=cairo_image_surface_create_for_data(image_buffer, CAIRO_FORMAT_RGB24, width, height, width * 4);
             image=gtk_image_new_from_surface(image_surface);
@@ -581,8 +578,8 @@ GtkWidget *create_image_display(blc_channel *tmp_channel)
             break;
         case 'yuv2':case 'UYVY':
             pthread_create(&init_table_thread, NULL, create_RGBA_from_YUYV, image);
-            width=channel->dims[1].length;
-            height=channel->dims[2].length;
+            width=array->dims[1].length;
+            height=array->dims[2].length;
             image_buffer = MANY_ALLOCATIONS(width*height * 4, uchar);
             image_surface=cairo_image_surface_create_for_data(image_buffer, CAIRO_FORMAT_RGB24, width, height, width * 4);
             image=gtk_image_new_from_surface(image_surface);
@@ -603,7 +600,7 @@ GtkWidget *create_image_display(blc_channel *tmp_channel)
     color_map=gray_colors;
     
     g_timeout_add(1000, frame_rate, (gpointer)framerate_statusbar);
-    SPRINTF(label_text, "%.4s, %.4s, %dx%d", UINT32_TO_STRING(type_string, channel->type), UINT32_TO_STRING(format_string, channel->format), width, height);
+    SPRINTF(label_text, "%.4s, %.4s, %dx%d", UINT32_TO_STRING(type_string, array->type), UINT32_TO_STRING(format_string, array->format), width, height);
     gtk_statusbar_push(GTK_STATUSBAR(general_statusbar), 0, label_text);
     gtk_widget_set_vexpand(scrolled_window, TRUE);
     gtk_widget_set_halign(image, GTK_ALIGN_START);