diff --git a/include/bioloid_registers.h b/include/bioloid_registers.h
index 0dd14ed1245c9a2d2e65a905469a2234fb3b1557..24c164a4c60208b38af1d95164f57ef41d1150e2 100644
--- a/include/bioloid_registers.h
+++ b/include/bioloid_registers.h
@@ -10,8 +10,8 @@ extern "C" {
 #define DEVICE_ID_OFFSET         ((unsigned short int)0x0003)
 #define BAUDRATE_OFFSET          ((unsigned short int)0x0004)
 #define RETURN_DELAY_OFFSET      ((unsigned short int)0x0005)
+#define MM_PERIOD_OFFSET         ((unsigned short int)0x0006)
 #define RETURN_LEVEL_OFFSET      ((unsigned short int)0x0010)
-#define MM_PERIOD_OFFSET         ((unsigned short int)0x0010)
 
 #define LAST_EEPROM_OFFSET       ((unsigned short int)0x0020)
 
@@ -196,8 +196,8 @@ typedef enum {
 #define      ZIGBEE_BASE_ADDRESS  0x42
 #define      ZIGBEE_MEM_LENGTH    6
 
-#define      MANAGER_BASE_ADDRESS 0x42
-#define      MANAGER_MEM_LENGTH   6
+#define      MANAGER_BASE_ADDRESS 0x48
+#define      MANAGER_MEM_LENGTH   50
 
 #ifdef __cplusplus
 }
diff --git a/include/comm.h b/include/comm.h
deleted file mode 100644
index 41b57cea13369f6093435d0d0354714d6f69c1ca..0000000000000000000000000000000000000000
--- a/include/comm.h
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef _COMM_H
-#define _COMM_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "stm32f4xx.h"
-
-// public functions
-void comm_init(void);
-void comm_start(void);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/bioloid_dyn_slave.c b/src/bioloid_dyn_slave.c
index 8e28e2d382d72dca9bb8ec9e6bca3bc64ee88088..4278c010f4b0be431f6dd663fc1f581bbf2652cf 100644
--- a/src/bioloid_dyn_slave.c
+++ b/src/bioloid_dyn_slave.c
@@ -147,12 +147,12 @@ void bioloid_dyn_slave_init(void)
   DYN_SLAVE_TIMER_ENABLE_CLK;
   bioloid_dyn_slave_tim_handle.Instance=DYN_SLAVE_TIMER;
   bioloid_dyn_slave_tim_handle.Init.Period = 1000;
-  bioloid_dyn_slave_tim_handle.Init.Prescaler = 42;
+  bioloid_dyn_slave_tim_handle.Init.Prescaler = 84;
   bioloid_dyn_slave_tim_handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
   bioloid_dyn_slave_tim_handle.Init.CounterMode = TIM_COUNTERMODE_UP;
   HAL_TIM_Base_Init(&bioloid_dyn_slave_tim_handle);
   // initialize the timer interrupts
-  HAL_NVIC_SetPriority(DYN_SLAVE_TIMER_IRQn, 3, 2);
+  HAL_NVIC_SetPriority(DYN_SLAVE_TIMER_IRQn, 2, 0);
   HAL_NVIC_EnableIRQ(DYN_SLAVE_TIMER_IRQn);
 }
 
diff --git a/src/comm.c b/src/comm.c
deleted file mode 100644
index ddafaa71adfc31979b6b8bc2fa9573378a483b9c..0000000000000000000000000000000000000000
--- a/src/comm.c
+++ /dev/null
@@ -1,263 +0,0 @@
-#include "comm.h"
-#include "gpio.h"
-#include "ram.h"
-#include "motion_manager.h"
-#include "action.h"
-#include "dynamixel_slave_uart_dma.h"
-#include "dynamixel_master_uart_dma.h"
-#include "adc_dma.h"
-
-#define      COMM_TIMER                 TIM7
-#define      COMM_TIMER_IRQn            TIM7_IRQn
-#define      COMM_TIMER_IRQHandler      TIM7_IRQHandler
-#define      COMM_TIMER_CLK             RCC_APB1Periph_TIM7
-
-// private variables
-uint8_t inst_packet[MAX_DATA_LENGTH];
-uint8_t status_packet[MAX_DATA_LENGTH];
-uint8_t data[MAX_DATA_LENGTH];
-// registered write operation variables
-uint8_t reg_data[MAX_DATA_LENGTH];
-uint8_t reg_address,reg_length,reg_op;
-
-// private functions
-uint8_t read_operation(uint8_t address, uint8_t length, uint8_t *data)
-{
-  uint8_t error;
-
-  // pre-read operation
-  // read operation
-  error=ram_read_table(address,length,data);
-  // post-read operation
-  if(ram_in_range(BIOLOID_PUSHBUTTON,BIOLOID_PUSHBUTTON,address,length))
-    ram_data[BIOLOID_PUSHBUTTON]=0x00;
-
-  return error;
-}
-
-uint8_t write_operation(uint8_t address,uint8_t length, uint8_t *data)
-{
-  uint8_t error=RAM_SUCCESS,byte_value,i,j,module;
-  uint16_t word_value;
-
-  // pre-write operation
-  if(ram_in_range(BIOLOID_DXL_POWER,BIOLOID_DXL_POWER,address,length))
-  {
-    if(data[BIOLOID_DXL_POWER-address]&0x01) dyn_master_enable_power();
-    else dyn_master_disable_power();
-  }
-  if(ram_in_range(BIOLOID_LED,BIOLOID_LED,address,length))
-  {
-    byte_value=data[BIOLOID_LED-address];
-    if(byte_value&0x01)
-      gpio_set_led(NORTH_LED);
-    else
-      gpio_clear_led(NORTH_LED);
-    if(byte_value&0x02)
-      gpio_set_led(SOUTH_LED);
-    else
-      gpio_clear_led(SOUTH_LED);
-    if(byte_value&0x04)
-      gpio_set_led(EAST_LED);
-    else
-      gpio_clear_led(EAST_LED);
-    if(byte_value&0x08)
-      gpio_set_led(WEST_LED);
-    else
-      gpio_clear_led(WEST_LED);
-  }
-  if(ram_in_range(BIOLOID_MM_PERIOD_L,BIOLOID_MM_PERIOD_H,address,length))
-  {
-    word_value=data[BIOLOID_MM_PERIOD_L-address]+(data[BIOLOID_MM_PERIOD_H-address]<<8);
-    manager_set_period(word_value);
-  }
-  for(i=BIOLOID_MM_MODULE_EN0,j=0;i<=BIOLOID_MM_MODULE_EN15;i++,j+=2)
-  {
-    if(ram_in_range(i,i,address,length))
-    {
-      byte_value=data[i-address];
-      if(byte_value&0x80) manager_enable_servo(j);
-      else manager_disable_servo(j);
-      module=(byte_value&0x70)>>4;
-      manager_set_module(j,module);
-      if(byte_value&0x08) manager_enable_servo(j+1);
-      else manager_disable_servo(j+1);
-      module=byte_value&0x07;
-      manager_set_module(j+1,module);
-    }
-  }
-  if(ram_in_range(BIOLOID_MM_CONTROL,BIOLOID_MM_CONTROL,address,length))
-  {
-    if(data[BIOLOID_MM_CONTROL-address]&0x01)
-      manager_enable();
-    else
-      manager_disable();
-  }
-  if(ram_in_range(BIOLOID_ACTION_CONTROL,BIOLOID_ACTION_CONTROL,address,length))
-  {
-    if(data[BIOLOID_ACTION_CONTROL-address]&0x01)
-      action_start_page();
-    if(data[BIOLOID_ACTION_CONTROL-address]&0x02)
-      action_stop_page();
-  }
-  if(ram_in_range(BIOLOID_ACTION_PAGE,BIOLOID_ACTION_PAGE,address,length))// load the page identifier 
-    action_load_page(data[BIOLOID_ACTION_PAGE-address]);
-  // write eeprom
-  for(i=address,j=0;i<LAST_EEPROM_OFFSET && i<(address+length);i++,j++)
-    EE_WriteVariable(i,data[j]);
-  // write operation
-  // error=ram_write_table(address,length,data);
-  // post-write operation
-
-  return error;
-}
-
-// interrupt handlers
-void COMM_TIMER_IRQHandler(void)
-{
-  uint8_t error,length,prev_id,id;
-  TDynVersion version;
-
-  TIM_ClearITPendingBit(COMM_TIMER,TIM_IT_Update);
-  if(dyn_slave_is_packet_ready())// check if a new instruction packet has been received
-  {
-    version=dyn_slave_get_inst_packet(inst_packet);// get the received packet
-    // check address
-    if(version==DYN_VER1)
-    {
-      id=dyn_get_id(inst_packet);
-      if(id==dyn_slave_get_address() || id==DYN_BROADCAST_ID)// the packet is addressed to this device or it is a broadcast
-      {
-        // check the packet checksum
-        if(dyn_check_checksum(inst_packet)==0xFF)// the incomming packet is okay
-        {
-          // process the packet
-          switch(dyn_get_instruction(inst_packet))
-          {
-            case DYN_PING: if(id!=DYN_BROADCAST_ID)
-                             dyn_slave_send_status_packet(DYN_NO_ERROR,0,data);
-                           break;
-            case DYN_READ: error=read_operation(dyn_get_read_address(inst_packet),dyn_get_read_length(inst_packet),data);
-                           if(dyn_slave_get_return_level()!=0 && id!=DYN_BROADCAST_ID)
-                           {
-                             if(error==RAM_SUCCESS)
-                               dyn_slave_send_status_packet(DYN_NO_ERROR,dyn_get_read_length(inst_packet),data);
-                             else
-                               dyn_slave_send_status_packet(DYN_INST_ERROR,0,data);
-                           }
-                           break;
-            case DYN_WRITE: length=dyn_get_write_data(inst_packet,data);
-                            error=write_operation(dyn_get_write_address(inst_packet),length,data);
-                            if(dyn_slave_get_return_level()==2 && id!=DYN_BROADCAST_ID)
-                            {
-                              if(error==RAM_SUCCESS)
-                                dyn_slave_send_status_packet(DYN_NO_ERROR,0,data);
-                              else
-                                dyn_slave_send_status_packet(DYN_INST_ERROR,0,data);
-                            }
-                            break;
-            case DYN_REG_WRITE: reg_length=dyn_get_reg_write_data(inst_packet,reg_data);
-                                reg_address=dyn_get_reg_write_address(inst_packet);
-                                reg_op=0x01;// signal there is a registered operation pending
-                                if(dyn_slave_get_return_level()==2 && id!=DYN_BROADCAST_ID)
-                                  dyn_slave_send_status_packet(DYN_NO_ERROR,0,data);
-                                break;
-            case DYN_ACTION: if(reg_op)
-                             {
-                               error=write_operation(reg_address,reg_length,reg_data);
-                               reg_op=0x00;
-                             }
-                             break;
-            case DYN_RESET:
-                            break;
-            case DYN_SYNC_READ: dyn_slave_send_status_packet(DYN_INST_ERROR,0,data);
-                                break;
-            case DYN_SYNC_WRITE: if(dyn_sync_write_id_present(inst_packet,dyn_slave_get_address()))// the device is addressed
-                                 {
-                                   length=dyn_get_sync_write_data(inst_packet,dyn_slave_get_address(),data);
-                                   error=write_operation(dyn_get_sync_write_address(inst_packet),length,data);
-                                 }
-                                 break;
-            case DYN_BULK_READ: if(dyn_bulk_read_id_present(inst_packet,dyn_slave_get_address(),&prev_id))
-                                {
-                                  length=dyn_get_bulk_read_length(inst_packet,dyn_slave_get_address());
-                                  error=read_operation(dyn_get_bulk_read_address(inst_packet,dyn_slave_get_address()),length,data);
-                                  if(prev_id==0xFF)// first device in the bulk read sequence
-                                  {
-                                    if(error==RAM_SUCCESS)
-                                      dyn_slave_send_status_packet(DYN_NO_ERROR,length,data);
-                                    else
-                                      dyn_slave_send_status_packet(DYN_INST_ERROR,0,data);
-                                  }
-                                  else// wait for the previous device in the sequence to send its data
-                                  {
-                                    do{
-                                      while(!dyn_slave_is_packet_ready());// wait until a new packet is received
-                                      dyn_slave_get_inst_packet(inst_packet);
-                                    }while(dyn_get_id(inst_packet)!=prev_id);
-                                    if(error==RAM_SUCCESS)
-                                      dyn_slave_send_status_packet(DYN_NO_ERROR,length,data);
-                                    else
-                                      dyn_slave_send_status_packet(DYN_INST_ERROR,0,data);
-                                  }
-                                }
-                                break;
-            case DYN_BULK_WRITE: dyn_slave_send_status_packet(DYN_INST_ERROR,0,data);
-                                 break;
-            default:
-                     break;
-          }
-        }
-        else
-        {
-          // send a checksum error answer
-          if(dyn_get_id(inst_packet)!=DYN_BROADCAST_ID)
-            dyn_slave_send_status_packet(DYN_CHECKSUM_ERROR,0,0x00);
-        }
-      }
-      if(id!=dyn_slave_get_address() || id==DYN_BROADCAST_ID)// the packet is addressed to another device
-      {
-        // send the incomming packet to the dynamixel bus
-        if(dyn_master_resend_inst_packet(inst_packet,status_packet)!=DYN_TIMEOUT)
-        {
-          // send the answer back to the computer
-          dyn_slave_resend_status_packet(status_packet);
-        }
-      }
-    }
-    else// version 2
-    {
-    }
-  }
-}
-
-// public functions
-void comm_init(void)
-{
-  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
-  NVIC_InitTypeDef NVIC_InitStructure;
-
-  RCC_APB1PeriphClockCmd(COMM_TIMER_CLK,ENABLE);
-
-  TIM_TimeBaseStructure.TIM_Period = 1000;
-  TIM_TimeBaseStructure.TIM_Prescaler = 42;
-  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
-  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
-  TIM_TimeBaseInit(COMM_TIMER,&TIM_TimeBaseStructure);
-
-  NVIC_InitStructure.NVIC_IRQChannel = COMM_TIMER_IRQn;
-  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
-  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
-  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
-  NVIC_Init(&NVIC_InitStructure);
-
-  /* initialize variables */
-  reg_op=0x00;
-}
-
-void comm_start(void)
-{
-  TIM_Cmd(COMM_TIMER, ENABLE);
-  TIM_ITConfig(COMM_TIMER, TIM_IT_Update, ENABLE);
-}
-                                                                                              
diff --git a/src/motion_manager.c b/src/motion_manager.c
index 0841cbac0f9cc97f44bf35010e89c9948853e8b5..64118953ac57ef9f130a4b80e1770f486560dc5e 100644
--- a/src/motion_manager.c
+++ b/src/motion_manager.c
@@ -2,6 +2,7 @@
 #include "motion_manager.h"
 #include "dyn_servos.h"
 #include "ram.h"
+#include "gpio.h"
 
 #define MANAGER_TIMER                   TIM3
 #define ENABLE_MANAGER_TIMER_CLK        __HAL_RCC_TIM3_CLK_ENABLE()
@@ -126,6 +127,7 @@ void MANAGER_TIMER_IRQHandler(void)
       // manager_send_motion_command();
       // get the disabled servos position
       // manager_get_current_position();
+      gpio_toggle_led(RXD_LED);
     }
   }
 }
@@ -261,10 +263,10 @@ void manager_init(uint16_t period_us)
   ENABLE_MANAGER_TIMER_CLK;
   MANAGER_TIM_Handle.Instance=MANAGER_TIMER;
   MANAGER_TIM_Handle.Init.Period = 0xFFFF;
-  MANAGER_TIM_Handle.Init.Prescaler = 42;
+  MANAGER_TIM_Handle.Init.Prescaler = 84;
   MANAGER_TIM_Handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
   MANAGER_TIM_Handle.Init.CounterMode = TIM_COUNTERMODE_UP;
-  HAL_NVIC_SetPriority(MANAGER_TIMER_IRQn, 2, 0);
+  HAL_NVIC_SetPriority(MANAGER_TIMER_IRQn, 2, 1);
   HAL_NVIC_EnableIRQ(MANAGER_TIMER_IRQn);
   /* use the internal clock */
   sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
@@ -291,7 +293,8 @@ uint16_t manager_get_period(void)
 void manager_set_period(uint16_t period_us)
 {
   manager_motion_period=(period_us*1000000)>>16;
-  ram_data[BIOLOID_MM_PERIOD_L]=period_us;
+  ram_data[BIOLOID_MM_PERIOD_L]=period_us&0x00FF;
+  ram_data[BIOLOID_MM_PERIOD_H]=(period_us&0xFF00)>>8;
 }
 
 inline void manager_enable(void)
diff --git a/src/ram.c b/src/ram.c
index cce0279314fb3f2a000ae4c4a025556e4433469f..7d49db96fccbe5d383208610011af1fb552f5454 100644
--- a/src/ram.c
+++ b/src/ram.c
@@ -22,6 +22,10 @@ void ram_init(void)
     ram_data[BAUDRATE_OFFSET]=(uint8_t)eeprom_data;
   if(EE_ReadVariable(RETURN_DELAY_OFFSET,&eeprom_data)==0)
     ram_data[RETURN_DELAY_OFFSET]=(uint8_t)eeprom_data;
+  if(EE_ReadVariable(MM_PERIOD_OFFSET,&eeprom_data)==0)
+    ram_data[MM_PERIOD_OFFSET]=(uint8_t)(eeprom_data&0x00FF);
+  if(EE_ReadVariable(MM_PERIOD_OFFSET+1,&eeprom_data)==0)
+    ram_data[MM_PERIOD_OFFSET+1]=(uint8_t)(eeprom_data&0x00FF);
   if(EE_ReadVariable(RETURN_LEVEL_OFFSET,&eeprom_data)==0)
     ram_data[RETURN_LEVEL_OFFSET]=(uint8_t)eeprom_data;
 }