diff --git a/Makefile b/Makefile
index ff8179a385e59ef6f8a485934f7d50bdfb7d59a5..c603cfd659a3de50039115d2bb92b53dc946d88f 100755
--- a/Makefile
+++ b/Makefile
@@ -10,26 +10,25 @@ TARGET_FILES=src/cm730_fw.c
 #TARGET_FILES+=src/test_charger.c
 TARGET_FILES+=src/system_stm32f1xx.c
 TARGET_FILES+=src/gpio.c
-TARGET_FILES+=src/ram.c
-TARGET_FILES+=src/darwin_time.c
+#TARGET_FILES+=src/darwin_time.c
 TARGET_FILES+=src/eeprom.c
-TARGET_FILES+=src/adc_dma.c
-TARGET_FILES+=src/imu.c
-TARGET_FILES+=src/darwin_dyn_slave.c
-TARGET_FILES+=src/darwin_dyn_master.c
-TARGET_FILES+=src/darwin_dyn_master_v2.c
+#TARGET_FILES+=src/adc_dma.c
+#TARGET_FILES+=src/imu.c
+#TARGET_FILES+=src/darwin_dyn_slave.c
+#TARGET_FILES+=src/darwin_dyn_master.c
+#TARGET_FILES+=src/darwin_dyn_master_v2.c
 TARGET_FILES+=src/stm32f1xx_hal_msp.c
-TARGET_FILES+=src/motion_manager.c
-TARGET_FILES+=src/action.c
-TARGET_FILES+=src/motion_pages.c
-TARGET_FILES+=src/walking.c
-TARGET_FILES+=src/darwin_math.c
-TARGET_FILES+=src/darwin_kinematics.c
-TARGET_FILES+=src/joint_motion.c
-TARGET_FILES+=src/head_tracking.c
-TARGET_FILES+=src/grippers.c
-TARGET_FILES+=src/smart_charger.c
-TARGET_FILES+=src/stairs.c
+#TARGET_FILES+=src/motion_manager.c
+#TARGET_FILES+=src/action.c
+#TARGET_FILES+=src/motion_pages.c
+#TARGET_FILES+=src/walking.c
+#TARGET_FILES+=src/darwin_math.c
+#TARGET_FILES+=src/darwin_kinematics.c
+#TARGET_FILES+=src/joint_motion.c
+#TARGET_FILES+=src/head_tracking.c
+#TARGET_FILES+=src/grippers.c
+#TARGET_FILES+=src/smart_charger.c
+#TARGET_FILES+=src/stairs.c
 
 TARGET_PROCESSOR=STM32F103RE
 
@@ -41,6 +40,7 @@ STM32_STARTUP_FILES_PATH = $(HAL_PATH)/startup_code/
 STM32_LINKER_SCRIPTS_PATH = ./linker_script
 UTILS_PATH=$(STM32_LIBRARIES_PATH)/utils
 COMM_PATH=$(STM32_LIBRARIES_PATH)/comm
+MEMORY_PATH=$(STM32_LIBRARIES_PATH)/memory
 USART_PATH=$(STM32_LIBRARIES_PATH)/f1/usart
 DYNAMIXEL_PATH=$(STM32_LIBRARIES_PATH)/dynamixel_base
 BUILD_PATH=build
@@ -49,7 +49,7 @@ COMPILE_OPTS = -mlittle-endian -mcpu=cortex-m3 -mthumb -mthumb-interwork
 COMPILE_OPTS += -Wall -O2 -fno-common -msoft-float -DUSE_HAL_DRIVER
 COMPILE_OPTS += -ffreestanding -nostdlib -D$(PROCESSOR_MACRO) 
 INCLUDE_DIRS = -I$(HAL_PATH)/include -I$(HAL_PATH)/include/core -I$(HAL_PATH)/include/devices 
-INCLUDE_DIRS += -I$(UTILS_PATH)/include -I$(COMM_PATH)/include -I$(DYNAMIXEL_PATH)/include -I$(USART_PATH)/include -I./include
+INCLUDE_DIRS += -I$(UTILS_PATH)/include -I$(COMM_PATH)/include -I$(MEMORY_PATH)/include -I$(DYNAMIXEL_PATH)/include -I$(USART_PATH)/include -I./include
 
 DOC_DIR = ./doc
 
@@ -63,7 +63,6 @@ ASFLAGS = $(COMPILE_OPTS) -c
 
 LD = $(TCHAIN_PREFIX)gcc
 LDFLAGS = -mthumb -mcpu=cortex-m3 -Wl,-Map=$@.map,-cref $(INCLUDE_DIRS) -T $(STM32_LINKER_SCRIPTS_PATH)/darwin.ld --specs=nosys.specs
-EXT_LIB = $(COMM_PATH)/lib/comm_m3.a $(UTILS_PATH)/lib/utils_m3.a $(DYNAMIXEL_PATH)/lib/dynamixel_m3.a
 
 OBJCP = $(TCHAIN_PREFIX)objcopy
 OBJCPFLAGS_HEX = -O ihex
@@ -97,6 +96,11 @@ TARGET_FILES+=$(USART_PATH)/src/usart3.c
 TARGET_FILES+=$(USART_PATH)/src/usart2.c
 TARGET_FILES+=$(USART_PATH)/src/usart1_remap.c
 
+TARGET_FILES+=$(wildcard $(UTILS_PATH)/src/*.c)
+TARGET_FILES+=$(wildcard $(COMM_PATH)/src/*.c)
+TARGET_FILES+=$(wildcard $(MEMORY_PATH)/src/*.c)
+TARGET_FILES+=$(wildcard $(DYNAMIXEL_PATH)/src/*.c)
+
 DARWIN_OBJS_TMP = $(notdir $(TARGET_FILES:.c=.o))
 DARWIN_OBJS = $(patsubst %,$(BUILD_PATH)/%,$(DARWIN_OBJS_TMP))
 
@@ -113,6 +117,14 @@ $(BUILD_PATH)/%.o: $(HAL_PATH)/src/%.c
 	$(CC) -c $(CFLAGS) -o $@ $<
 $(BUILD_PATH)/%.o: $(USART_PATH)/src/%.c
 	$(CC) -c $(CFLAGS) -o $@ $<
+$(BUILD_PATH)/%.o: $(UTILS_PATH)/src/%.c
+	$(CC) -c $(CFLAGS) -o $@ $<
+$(BUILD_PATH)/%.o: $(COMM_PATH)/src/%.c
+	$(CC) -c $(CFLAGS) -o $@ $<
+$(BUILD_PATH)/%.o: $(MEMORY_PATH)/src/%.c
+	$(CC) -c $(CFLAGS) -o $@ $<
+$(BUILD_PATH)/%.o: $(DYNAMIXEL_PATH)/src/%.c
+	$(CC) -c $(CFLAGS) -o $@ $<
 
 $(MAIN_OUT_ELF): mkdir_build $(DARWIN_OBJS) $(BUID_PATH)/$(STARTUP_FILE:.s=.o) 
 	$(LD) $(LDFLAGS) $(DARWIN_OBJS) $(BUILD_PATH)/$(STARTUP_FILE:.s=.o) $(EXT_LIB) -lm --output $@
diff --git a/include/darwin_conf.h b/include/darwin_conf.h
new file mode 100644
index 0000000000000000000000000000000000000000..f88b9148cd8433a328070008747d215fce357aa8
--- /dev/null
+++ b/include/darwin_conf.h
@@ -0,0 +1,10 @@
+#ifndef _DARWIN_CONF_H
+#define _DARWIN_CONF_H
+
+#define           RAM_SIZE               1024
+#define           EEPROM_SIZE            256
+
+/* GPIO configuration */
+#define RAM_GPIO_BASE_ADDRESS                 ((unsigned short int)0x0100)
+
+#endif
diff --git a/include/darwin_registers.h b/include/darwin_registers.h
index b84afcc7e78db9bde69d3b2fa67e03b84805ef40..bd2cc32e13a404aacb05f6a677307bf8fb15c2c5 100644
--- a/include/darwin_registers.h
+++ b/include/darwin_registers.h
@@ -254,40 +254,6 @@ typedef enum {
   DARWIN_STAIRS_X_SHIFT_BODY           = STAIRS_X_SHIFT_BODY,
 
 //RAM  
-  DARWIN_TX_LED_CNTRL              = 0x0100, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2  | bit 1 |      bit 0
-                                             //       |       |       |       | blink | toggle | value | internally used
-  DARWIN_TX_LED_PERIOD_L           = 0x0101,
-  DARWIN_TX_LED_PERIOD_H           = 0x0102,     
-  DARWIN_RX_LED_CNTRL              = 0x0103, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2  | bit 1 |      bit 0
-                                             //       |       |       |       | blink | toggle | value | internally used
-  DARWIN_RX_LED_PERIOD_L           = 0x0104,
-  DARWIN_RX_LED_PERIOD_H           = 0x0105,     
-  DARWIN_PLAY_LED_CNTRL            = 0x0106, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2  | bit 1 |      bit 0
-                                             //       |       |       |       | blink | toggle | value | internally used
-  DARWIN_PLAY_LED_PERIOD_L         = 0x0107,
-  DARWIN_PLAY_LED_PERIOD_H         = 0x0108,     
-  DARWIN_EDIT_LED_CNTRL            = 0x0109, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2  | bit 1 |      bit 0
-                                             //       |       |       |       | blink | toggle | value | internally used
-  DARWIN_EDIT_LED_PERIOD_L         = 0x010A,
-  DARWIN_EDIT_LED_PERIOD_H         = 0x010B,     
-  DARWIN_MNG_LED_CNTRL             = 0x010C, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2  | bit 1 |      bit 0
-                                             //       |       |       |       |       | toggle | value | internally used
-  DARWIN_AUX1_LED_CNTRL            = 0x010D, // bit 7 |  bit 6   |  bit 5  |  bit 4   |  bit 3  |  bit 2   |  bit 1  |      bit 0
-                                             // color | toggle_B | value_B | toggle_G | value_G | toggle_R | value_R | internally used
-  DARWIN_AUX1_LED_COLOR_L          = 0x010E, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2  | bit 1 | bit 0
-                                             //     green value LSB   |               red value                                   
-  DARWIN_AUX1_LED_COLOR_H          = 0x010F, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2  | bit 1 | bit 0
-                                             //       |        blue value                      | green value MSB
-  DARWIN_AUX2_LED_CNTRL            = 0x0110, // bit 7 |  bit 6   |  bit 5  |  bit 4   |  bit 3  |   bit 2  |  bit 1  |      bit 0
-                                             // color | toggle_B | value_B | toggle_G | value_G | toggle_R | value_R | internally used
-  DARWIN_AUX2_LED_COLOR_L          = 0x0111, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2  | bit 1 | bit 0
-                                             //     green value LSB   |               red value                                   
-  DARWIN_AUX2_LED_COLOR_H          = 0x0112, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2  | bit 1 | bit 0
-                                             //       |        blue value                      | green value MSB
-  DARWIN_START_PB_CNTRL            = 0x0113, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 |      bit 0
-                                             //       |       |       |       |       |       | value | internally used
-  DARWIN_MODE_PB_CNTRL             = 0x0114, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 |      bit 0
-                                             //       |       |       |       |       |       | value | internally used
   DARWIN_ADC_CNTRL                 = 0x0115, // bit 7 | bit 6 | bit 5 |  bit 4  | bit 3 | bit 2 | bit 1 | bit 0
                                              //       |       |       | running |       |       | start | stop
   DARWIN_ADC_PERIOD                = 0x0116,
@@ -647,23 +613,6 @@ typedef enum {
                                                    //          current phase        | climbing | stop stairs  | start stairs down | start stairs up
 }darwin_registers;
 
-#define      GPIO_BASE_ADDRESS       0x0100
-#define      GPIO_MEM_LENGTH         21
-#define      GPIO_INT_USED           0x01
-#define      GPIO_VALUE              0x02
-#define      GPIO_TOGGLE             0x04
-#define      GPIO_VALUE_R            0x02
-#define      GPIO_TOGGLE_R           0x04
-#define      GPIO_VALUE_G            0x08
-#define      GPIO_TOGGLE_G           0x10
-#define      GPIO_VALUE_B            0x20
-#define      GPIO_TOGGLE_B           0x40
-#define      GPIO_BLINK              0x08
-#define      GPIO_COLOR              0x80
-#define      GPIO_RED_COLOR          0x001F
-#define      GPIO_GREEN_COLOR        0x03E0
-#define      GPIO_BLUE_COLOR         0x7C00
-
 #define      ADC_BASE_ADDRESS        0x0115
 #define      ADC_MEM_LENGTH          30
 #define      ADC_START               0x01
diff --git a/include/gpio.h b/include/gpio.h
index 902deed83c2b080d7ddbf6b36d6c79f7a48717fa..cd2d43fd7f8b5e24c045fa80842911b9995e911c 100755
--- a/include/gpio.h
+++ b/include/gpio.h
@@ -6,6 +6,8 @@ extern "C" {
 #endif
 
 #include "stm32f1xx.h"
+#include "gpio_registers.h"
+#include "memory.h"
 
 #define           GPIO_RGB(R,G,B)         ((R&0x1F)+((G&0x1F)<<5)+((B&0x1F)<<10))
 
@@ -30,7 +32,7 @@ typedef struct
 
 typedef enum {START_PB=0,MODE_PB=1} pushbutton_t;
 
-void gpio_init(void);
+uint8_t gpio_init(TMemory *memory);
 // LED functions
 void gpio_set_led(led_t led_id);
 void gpio_clear_led(led_t led_id); 
@@ -40,10 +42,6 @@ void gpio_set_color(led_t led_id, uint16_t value);
 // Pushbuttons functions
 uint8_t gpio_is_pushbutton_pressed(pushbutton_t pb_id);
 void gpio_set_pushbutton_callback(pushbutton_t pb_id,void (*callback)(void));
-// operation functions
-uint8_t gpio_in_range(unsigned short int address,unsigned short int length);
-void gpio_process_read_cmd(unsigned short int address,unsigned short int length,unsigned char *data);
-void gpio_process_write_cmd(unsigned short int address,unsigned short int length,unsigned char *data);
 
 #ifdef __cplusplus
 }
diff --git a/include/gpio_registers.h b/include/gpio_registers.h
new file mode 100644
index 0000000000000000000000000000000000000000..c5376e3079099d0be14bc2c63545115892b2fbba
--- /dev/null
+++ b/include/gpio_registers.h
@@ -0,0 +1,56 @@
+#ifndef _GPIO_REGISTERS_H
+#define _GPIO_REGISTERS_H
+
+#ifndef RAM_GPIO_BASE_ADDRESS
+  #define RAM_GPIO_BASE_ADDRESS               ((unsigned short int)0x0000)
+#endif
+
+#define RAM_GPIO_LENGTH                       21
+
+#define TX_LED_CNTRL                          RAM_GPIO_BASE_ADDRESS// bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2  | bit 1 |      bit 0
+                                                                   //       |       |       |       | blink | toggle | value | internally used
+#define TX_LED_PERIOD                         (RAM_GPIO_BASE_ADDRESS+1)
+#define RX_LED_CNTRL                          (RAM_GPIO_BASE_ADDRESS+3)// bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2  | bit 1 |      bit 0
+                                                                       //       |       |       |       | blink | toggle | value | internally used
+#define RX_LED_PERIOD                         (RAM_GPIO_BASE_ADDRESS+4)
+#define PLAY_LED_CNTRL                        (RAM_GPIO_BASE_ADDRESS+6)// bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2  | bit 1 |      bit 0
+                                                                       //       |       |       |       | blink | toggle | value | internally used
+#define PLAY_LED_PERIOD                       (RAM_GPIO_BASE_ADDRESS+7)
+#define EDIT_LED_CNTRL                        (RAM_GPIO_BASE_ADDRESS+9)// bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2  | bit 1 |      bit 0
+                                                                       //       |       |       |       | blink | toggle | value | internally used
+#define EDIT_LED_PERIOD                       (RAM_GPIO_BASE_ADDRESS+10)
+#define MNG_LED_CNTRL                         (RAM_GPIO_BASE_ADDRESS+12)// bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2  | bit 1 |      bit 0
+                                                                        //       |       |       |       |       | toggle | value | internally used
+#define AUX1_LED_CNTRL                        (RAM_GPIO_BASE_ADDRESS+13)// bit 7 |  bit 6   |  bit 5  |  bit 4   |  bit 3  |  bit 2   |  bit 1  |      bit 0
+                                                                        // color | toggle_B | value_B | toggle_G | value_G | toggle_R | value_R | internally used
+#define AUX1_LED_COLOR                        (RAM_GPIO_BASE_ADDRESS+14)// bit 15 | bit 14 | bit 13 | bit 12 | bit 11 | bit 10  | bit 9 | bit 8
+                                                                        //       green value LSB    |               red value                                   
+                                                                        // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2  | bit 1 | bit 0
+                                                                        //       |        blue value                      | green value MSB
+#define AUX2_LED_CNTRL                        (RAM_GPIO_BASE_ADDRESS+16)// bit 7 |  bit 6   |  bit 5  |  bit 4   |  bit 3  |  bit 2   |  bit 1  |      bit 0
+                                                                        // color | toggle_B | value_B | toggle_G | value_G | toggle_R | value_R | internally used
+#define AUX2_LED_COLOR                        (RAM_GPIO_BASE_ADDRESS+17)// bit 15 | bit 14 | bit 13 | bit 12 | bit 11 | bit 10  | bit 9 | bit 8
+                                                                        //       green value LSB    |               red value                                   
+                                                                        // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2  | bit 1 | bit 0
+                                                                        //       |        blue value                      | green value MSB
+#define START_PB_CNTRL                        (RAM_GPIO_BASE_ADDRESS+19)// bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 |      bit 0
+                                                                        //       |       |       |       |       |       | value | internally used
+#define MODE_PB_CNTRL                         (RAM_GPIO_BASE_ADDRESS+20)// bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 |      bit 0
+
+#define GPIO_INT_USED                         0x01
+#define GPIO_VALUE                            0x02
+#define GPIO_TOGGLE                           0x04
+#define GPIO_VALUE_R                          0x02
+#define GPIO_TOGGLE_R                         0x04
+#define GPIO_VALUE_G                          0x08
+#define GPIO_TOGGLE_G                         0x10
+#define GPIO_VALUE_B                          0x20
+#define GPIO_TOGGLE_B                         0x40
+#define GPIO_BLINK                            0x08
+#define GPIO_COLOR                            0x80
+#define GPIO_RED_COLOR                        0x001F
+#define GPIO_GREEN_COLOR                      0x03E0
+#define GPIO_BLUE_COLOR                       0x7C00
+
+#endif
+
diff --git a/include/ram.h b/include/ram.h
deleted file mode 100755
index d920367d293c06bb7aa4e8a4ce2fe2cd1a47bd0b..0000000000000000000000000000000000000000
--- a/include/ram.h
+++ /dev/null
@@ -1,37 +0,0 @@
-#ifndef _RAM_H
-#define _RAM_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "stm32f1xx.h"
-#include "darwin_registers.h"
-
-#define      RAM_SUCCESS       0
-#define      RAM_BAD_ADDRESS  -1
-#define      RAM_WRITE_ERROR  -2
-#define      RAM_BAD_BIT      -3
-#define      RAM_BAD_ACCESS   -4
-
-#define      RAM_SIZE          1024
-
-extern uint8_t ram_data[RAM_SIZE];
-
-void ram_init(void);
-inline void ram_read_byte(uint16_t address, uint8_t *data);
-inline void ram_read_word(uint16_t address, uint16_t *data);
-uint8_t ram_read_table(uint16_t address, uint16_t length,uint8_t *data);
-uint8_t ram_set_bit(uint16_t address, uint8_t bit);
-uint8_t ram_clear_bit(uint16_t address, uint8_t bit);
-uint8_t ram_write_byte(uint16_t address, uint8_t data);
-uint8_t ram_write_word(uint16_t address, uint16_t data);
-uint8_t ram_write_table(uint16_t address, uint16_t length,uint8_t *data);
-inline uint8_t ram_in_range(uint16_t reg,uint16_t address,uint16_t length);
-uint8_t ram_in_window(uint16_t start_reg,uint16_t reg_length,uint16_t start_address,uint16_t address_length);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/cm730_fw.c b/src/cm730_fw.c
index 7693bace89751e5e77b06d534dc8b9787c1fb4bb..6514ca2a4ff90310937e5c880ba6dd5d7bc12412 100755
--- a/src/cm730_fw.c
+++ b/src/cm730_fw.c
@@ -1,7 +1,9 @@
 #include "stm32f1xx_hal.h"
+#include "darwin_conf.h"
+#include "darwin_registers.h"
+#include "memory.h"
 #include "gpio.h"
 #include "eeprom.h"
-#include "ram.h"
 #include "adc_dma.h"
 #include "imu.h"
 #include "darwin_time.h"
@@ -12,6 +14,8 @@
 #include "action.h"
 #include "action_id.h"
 
+TMemory darwin_memory;
+
 int main(void)
 {
   uint16_t eeprom_data,period;
@@ -20,26 +24,30 @@ int main(void)
   HAL_Init();
   /* initialize EEPROM */
   EE_Init();
-  // initialize the Dynamixel RAM memory space
-  ram_init();
+  /* initialize memory structure */
+  mem_init(&darwin_memory);
+  darwin_memory.eeprom_write_data=EE_WriteVariable;
+  darwin_memory.eeprom_read_data=EE_ReadVariable;
   /* initialize the GPIO module */
-  gpio_init();
+  gpio_init(&darwin_memory);
   // initialize adc
-  adc_init();
+//  adc_init();
   // initialize imu
-  imu_init();
+//  imu_init();
   // initialize time module
-  darwin_time_init();
+//  darwin_time_init();
   /* initialize the dynamixel slave interface */
-  darwin_dyn_slave_init();
-  darwin_dyn_slave_start();
+//  darwin_dyn_slave_init();
+//  darwin_dyn_slave_start();
   /* initialize motion manager module */
-  EE_ReadVariable(MM_PERIOD_OFFSET,&eeprom_data);
-  period=eeprom_data&0x00FF;
-  EE_ReadVariable(MM_PERIOD_OFFSET+1,&eeprom_data);
-  period+=((eeprom_data&0x00FF)<<8);
-  manager_init(period);
-  gpio_set_led(LED_4);
+//  EE_ReadVariable(MM_PERIOD_OFFSET,&eeprom_data);
+//  period=eeprom_data&0x00FF;
+//  EE_ReadVariable(MM_PERIOD_OFFSET+1,&eeprom_data);
+//  period+=((eeprom_data&0x00FF)<<8);
+//  manager_init(period);
+//  gpio_set_led(LED_4);
+  /* initialize the ram module */
+  ram_init(&darwin_memory);
 
   while(1);/* main function does not return */
 }
diff --git a/src/gpio.c b/src/gpio.c
index b86a6eec6344e4e9de9b84a1adb7b9f0a115b154..35315b2f0162a00e695a438062def0ea47d90f0b 100755
--- a/src/gpio.c
+++ b/src/gpio.c
@@ -75,21 +75,24 @@
 TIM_HandleTypeDef    GPO_TIM1Handle;
 TIM_HandleTypeDef    GPO_TIM2Handle;
 TIM_HandleTypeDef    GPO_TIM3Handle;
+TMemModule gpio_mem_module;
+
 // Pushbuttons callbacks
 void (*start_pb_callback)(void);
 void (*mode_pb_callback)(void);
+
 // LED's info structures
-const led_info_t leds[GPIO_NUM_LEDS]={{LED_TX_GPIO_PORT,LED_TX_PIN,&GPO_TIM1Handle,TIM_CHANNEL_1,DARWIN_TX_LED_CNTRL,DARWIN_TX_LED_PERIOD_L,GPIO_VALUE,GPIO_TOGGLE,GPIO_BLINK},
-                                      {LED_RX_GPIO_PORT,LED_RX_PIN,&GPO_TIM1Handle,TIM_CHANNEL_2,DARWIN_RX_LED_CNTRL,DARWIN_RX_LED_PERIOD_L,GPIO_VALUE,GPIO_TOGGLE,GPIO_BLINK},
-                                      {LED_2_GPIO_PORT,LED_2_PIN,&GPO_TIM1Handle,TIM_CHANNEL_3,DARWIN_PLAY_LED_CNTRL,DARWIN_PLAY_LED_PERIOD_L,GPIO_VALUE,GPIO_TOGGLE,GPIO_BLINK},
-                                      {LED_3_GPIO_PORT,LED_3_PIN,&GPO_TIM1Handle,TIM_CHANNEL_4,DARWIN_EDIT_LED_CNTRL,DARWIN_EDIT_LED_PERIOD_L,GPIO_VALUE,GPIO_TOGGLE,GPIO_BLINK},
-                                      {LED_4_GPIO_PORT,LED_4_PIN,0,0,DARWIN_MNG_LED_CNTRL,0x0000,GPIO_VALUE,GPIO_TOGGLE,0x00},
-                                      {LED_5_R_GPIO_PORT,LED_5_R_PIN,&GPO_TIM2Handle,TIM_CHANNEL_1,DARWIN_AUX1_LED_CNTRL,DARWIN_AUX1_LED_COLOR_L,GPIO_VALUE_R,GPIO_TOGGLE_R,0x00},
-                                      {LED_5_G_GPIO_PORT,LED_5_G_PIN,&GPO_TIM2Handle,TIM_CHANNEL_2,DARWIN_AUX1_LED_CNTRL,DARWIN_AUX1_LED_COLOR_L,GPIO_VALUE_G,GPIO_TOGGLE_G,0x00},
-                                      {LED_5_B_GPIO_PORT,LED_5_B_PIN,&GPO_TIM2Handle,TIM_CHANNEL_3,DARWIN_AUX1_LED_CNTRL,DARWIN_AUX1_LED_COLOR_L,GPIO_VALUE_B,GPIO_TOGGLE_B,0x00},
-                                      {LED_6_R_GPIO_PORT,LED_6_R_PIN,&GPO_TIM3Handle,TIM_CHANNEL_1,DARWIN_AUX2_LED_CNTRL,DARWIN_AUX2_LED_COLOR_L,GPIO_VALUE_R,GPIO_TOGGLE_R,0x00},
-                                      {LED_6_G_GPIO_PORT,LED_6_G_PIN,&GPO_TIM3Handle,TIM_CHANNEL_2,DARWIN_AUX2_LED_CNTRL,DARWIN_AUX2_LED_COLOR_L,GPIO_VALUE_G,GPIO_TOGGLE_G,0x00},
-                                      {LED_6_B_GPIO_PORT,LED_6_B_PIN,&GPO_TIM3Handle,TIM_CHANNEL_3,DARWIN_AUX2_LED_CNTRL,DARWIN_AUX2_LED_COLOR_L,GPIO_VALUE_B,GPIO_TOGGLE_B,0x00}};
+const led_info_t leds[GPIO_NUM_LEDS]={{LED_TX_GPIO_PORT,LED_TX_PIN,&GPO_TIM1Handle,TIM_CHANNEL_1,TX_LED_CNTRL,TX_LED_PERIOD,GPIO_VALUE,GPIO_TOGGLE,GPIO_BLINK},
+                                      {LED_RX_GPIO_PORT,LED_RX_PIN,&GPO_TIM1Handle,TIM_CHANNEL_2,RX_LED_CNTRL,RX_LED_PERIOD,GPIO_VALUE,GPIO_TOGGLE,GPIO_BLINK},
+                                      {LED_2_GPIO_PORT,LED_2_PIN,&GPO_TIM1Handle,TIM_CHANNEL_3,PLAY_LED_CNTRL,PLAY_LED_PERIOD,GPIO_VALUE,GPIO_TOGGLE,GPIO_BLINK},
+                                      {LED_3_GPIO_PORT,LED_3_PIN,&GPO_TIM1Handle,TIM_CHANNEL_4,EDIT_LED_CNTRL,EDIT_LED_PERIOD,GPIO_VALUE,GPIO_TOGGLE,GPIO_BLINK},
+                                      {LED_4_GPIO_PORT,LED_4_PIN,0,0,MNG_LED_CNTRL,0x0000,GPIO_VALUE,GPIO_TOGGLE,0x00},
+                                      {LED_5_R_GPIO_PORT,LED_5_R_PIN,&GPO_TIM2Handle,TIM_CHANNEL_1,AUX1_LED_CNTRL,AUX1_LED_COLOR,GPIO_VALUE_R,GPIO_TOGGLE_R,0x00},
+                                      {LED_5_G_GPIO_PORT,LED_5_G_PIN,&GPO_TIM2Handle,TIM_CHANNEL_2,AUX1_LED_CNTRL,AUX1_LED_COLOR,GPIO_VALUE_G,GPIO_TOGGLE_G,0x00},
+                                      {LED_5_B_GPIO_PORT,LED_5_B_PIN,&GPO_TIM2Handle,TIM_CHANNEL_3,AUX1_LED_CNTRL,AUX1_LED_COLOR,GPIO_VALUE_B,GPIO_TOGGLE_B,0x00},
+                                      {LED_6_R_GPIO_PORT,LED_6_R_PIN,&GPO_TIM3Handle,TIM_CHANNEL_1,AUX2_LED_CNTRL,AUX2_LED_COLOR,GPIO_VALUE_R,GPIO_TOGGLE_R,0x00},
+                                      {LED_6_G_GPIO_PORT,LED_6_G_PIN,&GPO_TIM3Handle,TIM_CHANNEL_2,AUX2_LED_CNTRL,AUX2_LED_COLOR,GPIO_VALUE_G,GPIO_TOGGLE_G,0x00},
+                                      {LED_6_B_GPIO_PORT,LED_6_B_PIN,&GPO_TIM3Handle,TIM_CHANNEL_3,AUX2_LED_CNTRL,AUX2_LED_COLOR,GPIO_VALUE_B,GPIO_TOGGLE_B,0x00}};
 uint16_t leds_data[GPIO_NUM_LEDS];
 
 // IRQ handler functions
@@ -98,7 +101,7 @@ void GPI_EXTI1_IRQHandler(void)
   if(__HAL_GPIO_EXTI_GET_IT(START_PB_PIN) != RESET)
   {
     __HAL_GPIO_EXTI_CLEAR_IT(START_PB_PIN);
-    if(ram_data[DARWIN_START_PB_CNTRL]&GPIO_INT_USED)
+    if(ram_data[START_PB_CNTRL]&GPIO_INT_USED)
     {
       if(start_pb_callback!=0)
         start_pb_callback();
@@ -107,7 +110,7 @@ void GPI_EXTI1_IRQHandler(void)
   if(__HAL_GPIO_EXTI_GET_IT(MODE_PB_PIN) != RESET)
   {
     __HAL_GPIO_EXTI_CLEAR_IT(MODE_PB_PIN);
-    if(ram_data[DARWIN_MODE_PB_CNTRL]&GPIO_INT_USED)
+    if(ram_data[MODE_PB_CNTRL]&GPIO_INT_USED)
     {
       if(mode_pb_callback!=0)
         mode_pb_callback();
@@ -397,8 +400,44 @@ void gpio_process_led(led_t led_id,uint16_t address,uint16_t length,uint8_t *dat
   }
 }
 
+void gpio_read_cmd(void *module,unsigned short int address,unsigned short int length,unsigned char *data)
+{
+  if(ram_in_range(START_PB_CNTRL,address,length))
+    if(!(ram_data[START_PB_CNTRL]&GPIO_INT_USED))/* GPIO is not internally used */
+    {
+      if(gpio_is_pushbutton_pressed(START_PB))
+        ram_data[START_PB_CNTRL]|=GPIO_VALUE;
+      else
+        ram_data[START_PB_CNTRL]&=(~GPIO_VALUE);
+    }
+  if(ram_in_range(MODE_PB_CNTRL,address,length))
+    if(!(ram_data[MODE_PB_CNTRL]&GPIO_INT_USED))/* GPIO is not internally used */
+    {
+      if(gpio_is_pushbutton_pressed(MODE_PB))
+        ram_data[MODE_PB_CNTRL]|=GPIO_VALUE;
+      else
+        ram_data[MODE_PB_CNTRL]&=(~GPIO_VALUE);
+    }
+}
+
+void gpio_write_cmd(void *module,unsigned short int address,unsigned short int length,unsigned char *data)
+{
+  /* process standard leds */
+  gpio_process_led(LED_TX,address,length,data);
+  gpio_process_led(LED_RX,address,length,data);
+  gpio_process_led(LED_2,address,length,data);
+  gpio_process_led(LED_3,address,length,data);
+  gpio_process_led(LED_4,address,length,data);
+  gpio_process_led(LED_5_R,address,length,data);
+  gpio_process_led(LED_5_G,address,length,data);
+  gpio_process_led(LED_5_B,address,length,data);
+  gpio_process_led(LED_6_R,address,length,data);
+  gpio_process_led(LED_6_G,address,length,data);
+  gpio_process_led(LED_6_B,address,length,data);
+}
+
 // public functions
-void gpio_init(void)
+uint8_t gpio_init(TMemory *memory)
 {
   GPIO_InitTypeDef GPIO_InitStructure;
   TIM_ClockConfigTypeDef sClockSourceConfig;
@@ -547,6 +586,17 @@ void gpio_init(void)
   gpio_clear_led(LED_6_R);
   gpio_clear_led(LED_6_G);
   gpio_clear_led(LED_6_B);
+
+  /* initialize memory module */
+  mem_module_init(&gpio_mem_module);
+  gpio_mem_module.write_cmd=gpio_write_cmd;
+  gpio_mem_module.read_cmd=gpio_read_cmd;
+  if(!mem_module_add_ram_segment(&gpio_mem_module,RAM_GPIO_BASE_ADDRESS,RAM_GPIO_LENGTH))
+    return 0x00;
+  if(!mem_add_module(memory,&gpio_mem_module))
+    return 0x00;
+
+  return 0x01;
 }
 
 void gpio_set_led(led_t led_id)
@@ -658,44 +708,4 @@ void gpio_set_pushbutton_callback(pushbutton_t pb_id,void (*callback)(void))
   }
 }
 
-uint8_t gpio_in_range(unsigned short int address,unsigned short int length)
-{
-  return ram_in_window(GPIO_BASE_ADDRESS,GPIO_MEM_LENGTH,address,length);
-}
-
-void gpio_process_read_cmd(unsigned short int address,unsigned short int length,unsigned char *data)
-{
-  if(ram_in_range(DARWIN_START_PB_CNTRL,address,length))
-    if(!(ram_data[DARWIN_START_PB_CNTRL]&GPIO_INT_USED))/* GPIO is not internally used */
-    {
-      if(gpio_is_pushbutton_pressed(START_PB))
-        ram_data[DARWIN_START_PB_CNTRL]|=GPIO_VALUE;
-      else
-        ram_data[DARWIN_START_PB_CNTRL]&=(~GPIO_VALUE);
-    }
-  if(ram_in_range(DARWIN_MODE_PB_CNTRL,address,length))
-    if(!(ram_data[DARWIN_MODE_PB_CNTRL]&GPIO_INT_USED))/* GPIO is not internally used */
-    {
-      if(gpio_is_pushbutton_pressed(MODE_PB))
-        ram_data[DARWIN_MODE_PB_CNTRL]|=GPIO_VALUE;
-      else
-        ram_data[DARWIN_MODE_PB_CNTRL]&=(~GPIO_VALUE);
-    }
-}
-
-void gpio_process_write_cmd(unsigned short int address,unsigned short int length,unsigned char *data)
-{
-  /* process standard leds */
-  gpio_process_led(LED_TX,address,length,data);
-  gpio_process_led(LED_RX,address,length,data);
-  gpio_process_led(LED_2,address,length,data);
-  gpio_process_led(LED_3,address,length,data);
-  gpio_process_led(LED_4,address,length,data);
-  gpio_process_led(LED_5_R,address,length,data);
-  gpio_process_led(LED_5_G,address,length,data);
-  gpio_process_led(LED_5_B,address,length,data);
-  gpio_process_led(LED_6_R,address,length,data);
-  gpio_process_led(LED_6_G,address,length,data);
-  gpio_process_led(LED_6_B,address,length,data);
-}
 
diff --git a/src/ram.c b/src/ram.c
deleted file mode 100755
index be8aa9dd975afec953d101fafbc9576ea391ecd4..0000000000000000000000000000000000000000
--- a/src/ram.c
+++ /dev/null
@@ -1,119 +0,0 @@
-#include "ram.h"
-#include "eeprom.h"
-
-uint8_t ram_data[RAM_SIZE];
-
-void ram_init(void)
-{
-  uint16_t eeprom_data,i;
-
-  for(i=0;i<RAM_SIZE;i++)
-    ram_data[i]=0x00;
-  // read contents from EEPROM to RAM
-  for(i=0;i<NB_OF_VAR;i++)
-  {
-    if(EE_ReadVariable(i,&eeprom_data)==0)
-      ram_data[i]=(uint8_t)(eeprom_data&0x00FF);
-  }
-}
-
-inline void ram_read_byte(uint16_t address,uint8_t *data)
-{
-  (*data)=ram_data[address];
-}
-
-inline void ram_read_word(uint16_t address, uint16_t *data)
-{
-  (*data)=ram_data[address];
-  (*data)+=ram_data[address+1]*256;
-}
-
-uint8_t ram_read_table(uint16_t address, uint16_t length,uint8_t *data)
-{
-  uint16_t i;
-
-  if((address+length)<=(RAM_SIZE-1))
-  {
-    for(i=0;i<length;i++)
-      data[i]=ram_data[address+i];
-    return RAM_SUCCESS;
-  }
-  else
-    return RAM_BAD_ADDRESS;
-}
-
-uint8_t ram_set_bit(uint16_t address, uint8_t bit)
-{
-  if(bit>=0 && bit<8)
-  {
-    ram_data[address]|=(0x01<<bit);
-    return RAM_SUCCESS;
-  }
-  else
-    return RAM_BAD_BIT;
-}
-
-uint8_t ram_clear_bit(uint16_t address, uint8_t bit)
-{
-  if(bit>=0 && bit<8)
-  {
-    ram_data[address]&=(~(0x01<<bit));
-    return RAM_SUCCESS;
-  }
-  else
-    return RAM_BAD_BIT;
-}
-
-uint8_t ram_write_byte(uint16_t address, uint8_t data)
-{
-  ram_data[address]=data;
-
-  return RAM_SUCCESS;
-}
-
-uint8_t ram_write_word(uint16_t address, uint16_t data)
-{
-  if(address < (RAM_SIZE-1))
-  {
-    ram_data[address]=data%256;
-    ram_data[address+1]=data/256;
-
-    return RAM_SUCCESS;
-  }
-  else
-    return RAM_BAD_ADDRESS;  
-}
-
-uint8_t ram_write_table(uint16_t address, uint16_t length,uint8_t *data)
-{
-  uint16_t i;
-
-  if((address+length)<RAM_SIZE)
-  {
-    for(i=0;i<length;i++)
-      ram_data[address+i]=data[i];
-    return RAM_SUCCESS;
-  }
-  else
-    return RAM_BAD_ADDRESS;
-}
-
-inline uint8_t ram_in_range(uint16_t reg,uint16_t address,uint16_t length)
-{
-  if(reg>=address && reg<(address+length))
-    return 0x01;
-  else
-    return 0x00;
-}
-
-uint8_t ram_in_window(uint16_t start_reg,uint16_t reg_length,uint16_t start_address,uint16_t address_length)
-{
-  uint16_t end_reg=start_reg+reg_length;
-  uint16_t end_address=start_address+address_length;
-
-  if((start_reg>=start_address && start_reg<end_address) || (end_reg>=start_address && end_reg<end_address) ||
-     (start_address>=start_reg && start_address<end_reg) || (end_address>=start_reg && end_address<end_reg))
-    return 0x01;
-  else
-    return 0x00;
-}