diff --git a/pattern_frame_buffer/include/frame_buffer.h b/pattern_frame_buffer/include/frame_buffer.h
index 6b48631151c97075bff569fdc8c376095b4c3f50..aca02b27815ec1ae5a128b4eb32a522c67dcde83 100644
--- a/pattern_frame_buffer/include/frame_buffer.h
+++ b/pattern_frame_buffer/include/frame_buffer.h
@@ -5,6 +5,8 @@
 extern "C" {
 #endif
 
+#include "memory.h"
+
 #ifndef FB_MAX_BUFFER_LEN
   #error "Please, specify the maximum frame buffer length with the FB_MAX_BUFFER_LEN macro"
 #endif
@@ -13,6 +15,7 @@ extern "C" {
 
 typedef struct
 {
+  TMemory *memory;
   unsigned short int ram_base_address;
   unsigned short int eeprom_base_address;
   unsigned short int num_rows;
@@ -23,7 +26,7 @@ typedef struct
   unsigned char pixel_buffer[FB_MAX_BUFFER_LEN];
 }TFrameBuffer;
 
-void frame_buffer_init(TFrameBuffer *fb,unsigned short int ram_base_address,unsigned short int eeprom_base_address);
+void frame_buffer_init(TFrameBuffer *fb,TMemory *memory,unsigned short int ram_base_address,unsigned short int eeprom_base_address);
 void frame_buffer_set_num_rows(TFrameBuffer *fb,unsigned short int rows);
 unsigned short int frame_buffer_get_num_rows(TFrameBuffer *fb);
 void frame_buffer_set_pixels_per_row(TFrameBuffer *fb,unsigned short int pixels);
diff --git a/pattern_frame_buffer/include/frame_buffer_control.h b/pattern_frame_buffer/include/frame_buffer_control.h
index ed4deeed49e34676641ff1bf7423c07a28a3f337..934b906a7c40b29c483c62a814d9406a3a883466 100644
--- a/pattern_frame_buffer/include/frame_buffer_control.h
+++ b/pattern_frame_buffer/include/frame_buffer_control.h
@@ -32,6 +32,7 @@ typedef struct TFBControl
   TScheduler *scheduler;
   sched_channel_t sch_channel;
   unsigned short int period_ms;
+  TMemory *memory;
   TMemModule mem_module;
   unsigned short int ram_base_address;
   unsigned short int eeprom_base_address;
diff --git a/pattern_frame_buffer/include/image_patterns.h b/pattern_frame_buffer/include/image_patterns.h
index 69696474c272258aeb2b0e0c7b105b83a7b626bc..d61001fc0ae404aeb17a6403ecb97e37213825af 100644
--- a/pattern_frame_buffer/include/image_patterns.h
+++ b/pattern_frame_buffer/include/image_patterns.h
@@ -3,6 +3,7 @@
 
 #include "patterns.h"
 #include "frame_buffer_control.h"
+#include "memory.h"
 
 #ifndef IMG_MAX_NUM_IMAGES
   #error "Please, specify the maximum number of images with the IMG_MAX_NUM_IMAGES macro"
@@ -20,7 +21,7 @@
 
 extern unsigned char img_pattern_data[IMG_MAX_NUM_IMAGES][IMG_MAX_IMAGE_WIDTH][IMG_MAX_IMAGE_HEIGHT][3];
 
-void img_patterns_init(unsigned short int ram_base_address);
+void img_patterns_init(TMemory *memory,unsigned short int ram_base_address);
 
 #pragma pack (push, 1)
 typedef struct
diff --git a/pattern_frame_buffer/src/frame_buffer.c b/pattern_frame_buffer/src/frame_buffer.c
index 4e35ec0c62296d8b1c294fde8d6e280acb18deac..ec208cadcc8e039f16d594f3f1677f5d7e1545ab 100644
--- a/pattern_frame_buffer/src/frame_buffer.c
+++ b/pattern_frame_buffer/src/frame_buffer.c
@@ -7,12 +7,12 @@ void frame_buffer_compute_free_memory(TFrameBuffer *fb)
 {
   fb->buffer_size=fb->num_rows*fb->num_pixels_per_row*FB_BYTES_PER_PIXEL;
   fb->free_mem=FB_MAX_BUFFER_LEN-fb->buffer_size*fb->num_buffers;
-  ram_data[fb->ram_base_address+FRAME_BUFFER_CONTROL_FREE_MEMORY_OFFSET]=fb->free_mem&0x00FF;
-  ram_data[fb->ram_base_address+FRAME_BUFFER_CONTROL_FREE_MEMORY_OFFSET+1]=(fb->free_mem&0xFF00)>>8;
+  fb->memory->data[fb->ram_base_address+FRAME_BUFFER_CONTROL_FREE_MEMORY_OFFSET]=fb->free_mem&0x00FF;
+  fb->memory->data[fb->ram_base_address+FRAME_BUFFER_CONTROL_FREE_MEMORY_OFFSET+1]=(fb->free_mem&0xFF00)>>8;
 }
 
 // public functions
-void frame_buffer_init(TFrameBuffer *fb,unsigned short int ram_base_address,unsigned short int eeprom_base_address)
+void frame_buffer_init(TFrameBuffer *fb,TMemory *memory,unsigned short int ram_base_address,unsigned short int eeprom_base_address)
 {
   unsigned int i;
 
@@ -22,6 +22,7 @@ void frame_buffer_init(TFrameBuffer *fb,unsigned short int ram_base_address,unsi
   frame_buffer_set_num_buffers(fb,DEFAULT_FRAME_BUFFER_CONTROL_NUM_BUFFERS);
   fb->ram_base_address=ram_base_address;
   fb->eeprom_base_address=eeprom_base_address;
+  fb->memory=memory;
 
   for(i=0;i<FB_MAX_BUFFER_LEN;i++)
     fb->pixel_buffer[i]=0x00;
@@ -30,8 +31,8 @@ void frame_buffer_init(TFrameBuffer *fb,unsigned short int ram_base_address,unsi
 void frame_buffer_set_num_rows(TFrameBuffer *fb,unsigned short int rows)
 {
   fb->num_rows=rows;
-  ram_data[fb->eeprom_base_address+FRAME_BUFFER_CONTROL_NUM_ROWS_OFFSET]=rows&0x00FF;
-  ram_data[fb->eeprom_base_address+FRAME_BUFFER_CONTROL_NUM_ROWS_OFFSET+1]=(rows&0xFF00)>>8;
+  fb->memory->data[fb->eeprom_base_address+FRAME_BUFFER_CONTROL_NUM_ROWS_OFFSET]=rows&0x00FF;
+  fb->memory->data[fb->eeprom_base_address+FRAME_BUFFER_CONTROL_NUM_ROWS_OFFSET+1]=(rows&0xFF00)>>8;
   frame_buffer_compute_free_memory(fb);
 }
 
@@ -43,8 +44,8 @@ unsigned short int frame_buffer_get_num_rows(TFrameBuffer *fb)
 void frame_buffer_set_pixels_per_row(TFrameBuffer *fb,unsigned short int pixels)
 {
   fb->num_pixels_per_row=pixels;
-  ram_data[fb->eeprom_base_address+FRAME_BUFFER_CONTROL_NUM_PIXELS_OFFSET]=pixels&0x00FF;
-  ram_data[fb->eeprom_base_address+FRAME_BUFFER_CONTROL_NUM_PIXELS_OFFSET+1]=(pixels&0xFF00)>>8;
+  fb->memory->data[fb->eeprom_base_address+FRAME_BUFFER_CONTROL_NUM_PIXELS_OFFSET]=pixels&0x00FF;
+  fb->memory->data[fb->eeprom_base_address+FRAME_BUFFER_CONTROL_NUM_PIXELS_OFFSET+1]=(pixels&0xFF00)>>8;
   frame_buffer_compute_free_memory(fb);
 }
 
@@ -56,8 +57,8 @@ unsigned short int frame_buffer_get_pixels_per_row(TFrameBuffer *fb)
 void frame_buffer_set_num_buffers(TFrameBuffer *fb,unsigned char num)
 {
   fb->num_buffers=num;
-  ram_data[fb->eeprom_base_address+FRAME_BUFFER_CONTROL_NUM_BUFFERS_OFFSET]=num&0x00FF;
-  ram_data[fb->eeprom_base_address+FRAME_BUFFER_CONTROL_NUM_BUFFERS_OFFSET+1]=(num&0xFF00)>>8;
+  fb->memory->data[fb->eeprom_base_address+FRAME_BUFFER_CONTROL_NUM_BUFFERS_OFFSET]=num&0x00FF;
+  fb->memory->data[fb->eeprom_base_address+FRAME_BUFFER_CONTROL_NUM_BUFFERS_OFFSET+1]=(num&0xFF00)>>8;
   frame_buffer_compute_free_memory(fb);
 }
 
diff --git a/pattern_frame_buffer/src/frame_buffer_control.c b/pattern_frame_buffer/src/frame_buffer_control.c
index 12efbd809630cd1fe262fc46e5c4f34b7271bd68..f1e2277e793566d65bee38a062a5ce23e7487827 100644
--- a/pattern_frame_buffer/src/frame_buffer_control.c
+++ b/pattern_frame_buffer/src/frame_buffer_control.c
@@ -161,7 +161,9 @@ void frame_buffer_control_write_cmd(void *module,unsigned short int address,unsi
 
 void frame_buffer_control_read_cmd(void *module,unsigned short int address,unsigned short int length,unsigned char *data)
 {
-  ram_read_table(address,length,data);
+  TFBControl *control=(TFBControl *)module;
+
+  ram_read_table(control->memory,address,length,data);
 }
 
 void frame_buffer_control_scheduler(void *data)
@@ -180,7 +182,7 @@ unsigned char frame_buffer_control_init(TFBControl *control,TMemory *memory,TSch
   // initialize internal variables
   frame_buffer_control_clear_patterns(control);
   frame_buffer_control_clear_copy_functions(control);
-  frame_buffer_init(&control->frame_buffer,ram_base_address,eeprom_base_address);
+  frame_buffer_init(&control->frame_buffer,memory,ram_base_address,eeprom_base_address);
   control->ram_base_address=ram_base_address;
   control->eeprom_base_address=eeprom_base_address;
 
@@ -189,13 +191,14 @@ unsigned char frame_buffer_control_init(TFBControl *control,TMemory *memory,TSch
   control->scheduler=scheduler;
   control->sch_channel=ch;
 
-  img_patterns_init(ram_base_address);
+  img_patterns_init(memory,ram_base_address);
 
   /* initialize memory module */
   mem_module_init(&control->mem_module);
   control->mem_module.write_cmd=frame_buffer_control_write_cmd;
   control->mem_module.read_cmd=frame_buffer_control_read_cmd;
   control->mem_module.data=control;
+  control->memory=memory;
   if(!mem_module_add_ram_segment(&control->mem_module,ram_base_address,RAM_FRAME_BUFFER_CONTROL_LENGTH))
     return 0x00;
   if(!mem_module_add_eeprom_segment(&control->mem_module,eeprom_base_address,EEPROM_FRAME_BUFFER_CONTROL_LENGTH))
@@ -209,20 +212,20 @@ unsigned char frame_buffer_control_init(TFBControl *control,TMemory *memory,TSch
 void frame_buffer_control_start(TFBControl *control)
 {
   scheduler_enable_channel(control->scheduler,control->sch_channel);
-  ram_data[control->ram_base_address+FRAME_BUFFER_CONTROL_OFFSET]|=FRAME_BUFFER_CONTROL_RUNNING;
+  control->memory->data[control->ram_base_address+FRAME_BUFFER_CONTROL_OFFSET]|=FRAME_BUFFER_CONTROL_RUNNING;
 }
 
 void frame_buffer_control_stop(TFBControl *control)
 {
   scheduler_disable_channel(control->scheduler,control->sch_channel);
-  ram_data[control->ram_base_address+FRAME_BUFFER_CONTROL_OFFSET]&=(~FRAME_BUFFER_CONTROL_RUNNING);
+  control->memory->data[control->ram_base_address+FRAME_BUFFER_CONTROL_OFFSET]&=(~FRAME_BUFFER_CONTROL_RUNNING);
 }
 
 void frame_buffer_control_set_period(TFBControl *control,unsigned short int period_ms)
 {
   scheduler_change_period(control->scheduler,control->sch_channel,period_ms);
-  ram_data[control->eeprom_base_address+FRAME_BUFFER_CONTROL_PERIOD_OFFSET]=period_ms&0x00FF;
-  ram_data[control->eeprom_base_address+FRAME_BUFFER_CONTROL_PERIOD_OFFSET+1]=(period_ms&0xFF00)>>8;
+  control->memory->data[control->eeprom_base_address+FRAME_BUFFER_CONTROL_PERIOD_OFFSET]=period_ms&0x00FF;
+  control->memory->data[control->eeprom_base_address+FRAME_BUFFER_CONTROL_PERIOD_OFFSET+1]=(period_ms&0xFF00)>>8;
   control->period_ms=period_ms;
 }
 
@@ -241,22 +244,22 @@ unsigned char frame_buffer_control_add_pattern(TFBControl *control,pattern_func_
   num_cols=frame_buffer_get_pixels_per_row(&control->frame_buffer); 
   if(area->min_row>num_rows || area->max_row>num_rows || area->min_row>area->max_row)
   {
-    ram_data[control->ram_base_address+FRAME_BUFFER_CONTROL_PATTERN_INDEX_OFFSET]=0xFF;
+    control->memory->data[control->ram_base_address+FRAME_BUFFER_CONTROL_PATTERN_INDEX_OFFSET]=0xFF;
     return 0xFF;
   }
   if(area->min_col>num_cols || area->max_col>num_cols || area->min_col>area->max_col)
   {
-    ram_data[control->ram_base_address+FRAME_BUFFER_CONTROL_PATTERN_INDEX_OFFSET]=0xFF;
+    control->memory->data[control->ram_base_address+FRAME_BUFFER_CONTROL_PATTERN_INDEX_OFFSET]=0xFF;
     return 0xFF;
   }
   if(data_length>FBC_MAX_DATA_PATTERN_LEN)
   {
-    ram_data[control->ram_base_address+FRAME_BUFFER_CONTROL_PATTERN_INDEX_OFFSET]=0xFF;
+    control->memory->data[control->ram_base_address+FRAME_BUFFER_CONTROL_PATTERN_INDEX_OFFSET]=0xFF;
     return 0xFF;
   }
   if(buffer_id>=frame_buffer_get_num_buffers(&control->frame_buffer))
   {
-    ram_data[control->ram_base_address+FRAME_BUFFER_CONTROL_PATTERN_INDEX_OFFSET]=0xFF;
+    control->memory->data[control->ram_base_address+FRAME_BUFFER_CONTROL_PATTERN_INDEX_OFFSET]=0xFF;
     return 0xFF;
   }
 
@@ -274,13 +277,13 @@ unsigned char frame_buffer_control_add_pattern(TFBControl *control,pattern_func_
         control->pat_parameters[j][i]=((unsigned char *)data)[i];
       control->pat_functions[j]=function;
       control->num_patterns++;
-      ram_data[control->ram_base_address+FRAME_BUFFER_CONTROL_NUM_PATTERN_OFFSET]=control->num_patterns;
-      ram_data[control->ram_base_address+FRAME_BUFFER_CONTROL_PATTERN_INDEX_OFFSET]=j;
+      control->memory->data[control->ram_base_address+FRAME_BUFFER_CONTROL_NUM_PATTERN_OFFSET]=control->num_patterns;
+      control->memory->data[control->ram_base_address+FRAME_BUFFER_CONTROL_PATTERN_INDEX_OFFSET]=j;
       return j;
     }
   }
   // the pattern could not be added
-  ram_data[control->ram_base_address+FRAME_BUFFER_CONTROL_PATTERN_INDEX_OFFSET]=0xFF;
+  control->memory->data[control->ram_base_address+FRAME_BUFFER_CONTROL_PATTERN_INDEX_OFFSET]=0xFF;
   return 0xFF;
 }
 
diff --git a/pattern_frame_buffer/src/image_patterns.c b/pattern_frame_buffer/src/image_patterns.c
index f49a883511e192516bc59d9508efcc551d841141..85f7aadce9cb2cc2f5aeb8924d5fe203065bbc54 100644
--- a/pattern_frame_buffer/src/image_patterns.c
+++ b/pattern_frame_buffer/src/image_patterns.c
@@ -43,12 +43,12 @@ void img_patterns_compute_range(unsigned short int area_min,unsigned short int a
 }
 
 // public functions
-void img_patterns_init(unsigned short int ram_base_address)
+void img_patterns_init(TMemory *memory,unsigned short int ram_base_address)
 {
   //initialize internal variables (read only variables)
-  ram_data[ram_base_address+FRAME_BUFFER_CONTROL_IMG_MAX_WIDTH_OFFSET]=IMG_MAX_IMAGE_WIDTH;
-  ram_data[ram_base_address+FRAME_BUFFER_CONTROL_IMG_MAX_HEIGHT_OFFSET]=IMG_MAX_IMAGE_HEIGHT;
-  ram_data[ram_base_address+FRAME_BUFFER_CONTROL_IMG_NUM_IMGS_OFFSET]=IMG_MAX_NUM_IMAGES;
+  memory->data[ram_base_address+FRAME_BUFFER_CONTROL_IMG_MAX_WIDTH_OFFSET]=IMG_MAX_IMAGE_WIDTH;
+  memory->data[ram_base_address+FRAME_BUFFER_CONTROL_IMG_MAX_HEIGHT_OFFSET]=IMG_MAX_IMAGE_HEIGHT;
+  memory->data[ram_base_address+FRAME_BUFFER_CONTROL_IMG_NUM_IMGS_OFFSET]=IMG_MAX_NUM_IMAGES;
 }
 
 void img_general(TLEDArea *area,TIMGDisplayData *pattern_data,unsigned char buffer_id,unsigned short int period,TFBControl *control)