diff --git a/dynamixel_manager/include/modules/action_mm_registers.h b/dynamixel_manager/include/modules/action_mm_registers.h
deleted file mode 100644
index 847f0534efaf38bafcf6ac2c3b8e00ee1fec57e9..0000000000000000000000000000000000000000
--- a/dynamixel_manager/include/modules/action_mm_registers.h
+++ /dev/null
@@ -1,13 +0,0 @@
-#ifndef _ACTION_MM_REGISTERS_H
-#define _ACTION_MM_REGISTERS_H
-
-#define RAM_ACTION_MM_LENGTH                 2
-
-#define ACTION_MM_CONTROL_OFFSET             0
-#define ACTION_MM_PAGE_OFFSET                1
-  #define ACTION_MM_START                    0x01
-  #define ACTION_MM_STOP                     0x02
-  #define ACTION_MM_RUNNING                  0x80
-
-#endif
-
diff --git a/dynamixel_manager/include/modules/action_registers.h b/dynamixel_manager/include/modules/action_registers.h
new file mode 100644
index 0000000000000000000000000000000000000000..f1c156338974c3b206e8b81493fc8f0a11b1c35a
--- /dev/null
+++ b/dynamixel_manager/include/modules/action_registers.h
@@ -0,0 +1,13 @@
+#ifndef _ACTION_REGISTERS_H
+#define _ACTION_REGISTERS_H
+
+#define RAM_ACTION_LENGTH                 2
+
+#define ACTION_CONTROL_OFFSET             0
+#define ACTION_PAGE_OFFSET                1
+  #define ACTION_START                    0x01
+  #define ACTION_STOP                     0x02
+  #define ACTION_RUNNING                  0x80
+
+#endif
+
diff --git a/dynamixel_manager/include/modules/head_tracking.h b/dynamixel_manager/include/modules/head_tracking.h
new file mode 100644
index 0000000000000000000000000000000000000000..4b552b796b89217cb78c9866e1fb876721b385c4
--- /dev/null
+++ b/dynamixel_manager/include/modules/head_tracking.h
@@ -0,0 +1,60 @@
+#ifndef _HEAD_TRACKING_H
+#define _HEAD_TRACKINH_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "motion_module.h"
+#include "memory.h"
+
+typedef struct{
+  unsigned short int kp;
+  unsigned short int ki;
+  unsigned short int kd;
+  long int prev_error;// 48|16
+  long int integral_part;
+  long int integral_clamp;
+  long int max_angle;
+  long int min_angle;
+  long int target_angle;
+}TJointControl;
+ 
+typedef struct{
+  TMotionModule mmodule;
+  TMemory *memory;
+  TMemModule mem_module;
+  unsigned short int ram_base_address;
+  unsigned short int eeprom_base_address;
+  TJointControl tracking_pan;
+  unsigned char pan_servo_id;
+  TJointControl tracking_tilt;
+  unsigned char tilt_servo_id;
+  long int tracking_period;
+  short int tracking_period_ms;
+  unsigned char tracking_enabled;
+}THeadMModule;
+
+// public functions
+unsigned char head_tracking_init(THeadMModule *joint,TMemory *memory,unsigned short int ram_base_address,unsigned short int eeprom_base_address);
+void head_tracking_start(THeadMModule *joint);
+void head_tracking_stop(THeadMModule *joint);
+unsigned char head_is_tracking(THeadMModule *joint);
+void head_tracking_set_pan_range(THeadMModule *joint,short int max_angle,short int min_angle);
+void head_tracking_get_pan_range(THeadMModule *joint,short int *max_angle,short int *min_angle);
+void head_tracking_set_pan_pid(THeadMModule *joint,unsigned short int kp,unsigned short int ki,unsigned short int kd, unsigned short int i_clamp);
+void head_tracking_get_pan_pid(THeadMModule *joint,unsigned short int *kp,unsigned short int *ki,unsigned short int *kd, unsigned short int *i_clamp);
+void head_tracking_set_tilt_range(THeadMModule *joint,short int max_angle,short int min_angle);
+void head_tracking_get_tilt_range(THeadMModule *joint,short int *max_angle,short int *min_angle);
+void head_tracking_set_tilt_pid(THeadMModule *joint,unsigned short int kp,unsigned short int ki,unsigned short int kd, unsigned short int i_clamp);
+void head_tracking_get_tilt_pid(THeadMModule *joint,unsigned short int *kp,unsigned short int *ki,unsigned short int *kd, unsigned short int *i_clamp);
+void head_tracking_set_pan_pan(THeadMModule *joint,short int target);
+void head_tracking_set_tilt_target(THeadMModule *joint,short int target);
+void head_tracking_set_pan_servo_id(THeadMModule *joint,unsigned char servo_id);
+void head_tracking_set_tilt_servo_id(THeadMModule *joint,unsigned char servo_id);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/dynamixel_manager/include/modules/head_tracking_registers.h b/dynamixel_manager/include/modules/head_tracking_registers.h
new file mode 100644
index 0000000000000000000000000000000000000000..761a2c45348383e981d7c54a7f7287b6de0b1d7e
--- /dev/null
+++ b/dynamixel_manager/include/modules/head_tracking_registers.h
@@ -0,0 +1,54 @@
+#ifndef _HEAD_TRACKING_REGISTERS_H
+#define _HEAD_TRACKING_REGISTERS_H
+
+#define RAM_HEAD_TRACKING_LENGTH                    13
+
+#define HEAD_TRACKING_CONTROL_OFFSET                0 // bit 7 | bit 6 | bit 5 |  bit 4   | bit 3 | bit 2 |     bit 1     |      bit 0
+                                                      //       |       |       | tracking |       |       | stop tracking | start tracking
+  #define HEAD_TRACKING_START                       0x01
+  #define HEAD_TRACKING_STOP                        0x02
+  #define HEAD_TRACKING_RUNNING                     0x10
+#define HEAD_TRACKING_MAX_PAN_OFFSET                1
+#define HEAD_TRACKING_MIN_PAN_OFFSET                3
+#define HEAD_TRACKING_PAN_TARGET_OFFSET             5
+#define HEAD_TRACKING_MAX_TILT_OFFSET               7
+#define HEAD_TRACKING_MIN_TILT_OFFSET               9
+#define HEAD_TRACKING_TILT_TARGET_OFFSET            11
+
+#define EEPROM_HEAD_TRACKING_LENGTH                 18
+
+#define HEAD_TRACKING_PAN_P_GAIN_OFFSET             0
+#define HEAD_TRACKING_PAN_I_GAIN_OFFSET             2
+#define HEAD_TRACKING_PAN_D_GAIN_OFFSET             4
+#define HEAD_TRACKING_PAN_I_CLAMP_OFFSET            6
+#define HEAD_TRACKING_TILT_P_GAIN_OFFSET            8
+#define HEAD_TRACKING_TILT_I_GAIN_OFFSET            10
+#define HEAD_TRACKING_TILT_D_GAIN_OFFSET            12
+#define HEAD_TRACKING_TILT_I_CLAMP_OFFSET           14
+#define HEAD_TRACKING_PAN_SERVO_ID_OFFSET           16
+#define HEAD_TRACKING_TILT_SERVO_ID_OFFSET          17
+
+#define head_tracking_eeprom_data(name,section_name,base_address,DEFAULT_PAN_P_GAIN,DEFAULT_PAN_I_GAIN,DEFAULT_PAN_D_GAIN,DEFAULT_PAN_I_CLAMP,DEFAULT_TILT_P_GAIN,DEFAULT_TILT_I_GAIN,DEFAULT_TILT_D_GAIN,DEFAULT_TILT_I_CLAMP,DEFAULT_PAN_SERVO_ID,DEFAULT_TILT_SERVO_ID) \
+unsigned short int name##_eeprom_data[] __attribute__ ((section (section_name))) __attribute__ ((aligned (4)))= {\
+  DEFAULT_PAN_P_GAIN&0x00FF,base_address+HEAD_TRACKING_PAN_P_GAIN_OFFSET, \
+  (DEFAULT_PAN_P_GAIN>>8)&0x00FF,base_address+HEAD_TRACKING_PAN_P_GAIN_OFFSET+1, \
+  DEFAULT_PAN_I_GAIN&0x00FF,base_address+HEAD_TRACKING_PAN_I_GAIN_OFFSET, \
+  (DEFAULT_PAN_I_GAIN>>8)&0x00FF,base_address+HEAD_TRACKING_PAN_I_GAIN_OFFSET+1, \
+  DEFAULT_PAN_D_GAIN&0x00FF,base_address+HEAD_TRACKING_PAN_D_GAIN_OFFSET, \
+  (DEFAULT_PAN_D_GAIN>>8)&0x00FF,base_address+HEAD_TRACKING_PAN_D_GAIN_OFFSET+1, \
+  DEFAULT_PAN_I_CLAMP&0x00FF,base_address+HEAD_TRACKING_PAN_I_CLAMP_OFFSET, \
+  (DEFAULT_PAN_I_CLAMP>>8)&0x00FF,base_address+HEAD_TRACKING_PAN_I_CLAMP_OFFSET+1, \
+  DEFAULT_TILT_P_GAIN&0x00FF,base_address+HEAD_TRACKING_TILT_P_GAIN_OFFSET, \
+  (DEFAULT_TILT_P_GAIN>>8)&0x00FF,base_address+HEAD_TRACKING_TILT_P_GAIN_OFFSET+1, \
+  DEFAULT_TILT_I_GAIN&0x00FF,base_address+HEAD_TRACKING_TILT_I_GAIN_OFFSET, \
+  (DEFAULT_TILT_I_GAIN>>8)&0x00FF,base_address+HEAD_TRACKING_TILT_I_GAIN_OFFSET+1, \
+  DEFAULT_TILT_D_GAIN&0x00FF,base_address+HEAD_TRACKING_TILT_D_GAIN_OFFSET, \
+  (DEFAULT_TILT_D_GAIN>>8)&0x00FF,base_address+HEAD_TRACKING_TILT_D_GAIN_OFFSET+1, \
+  DEFAULT_TILT_I_CLAMP&0x00FF,base_address+HEAD_TRACKING_TILT_I_CLAMP_OFFSET, \
+  (DEFAULT_TILT_I_CLAMP>>8)&0x00FF,base_address+HEAD_TRACKING_TILT_I_CLAMP_OFFSET+1 \
+  DEFAULT_PAN_SERVO_ID&0x00FF,base_address+HEAD_TRACKING_PAN_SERVO_ID_OFFSET, \
+  DEFAULT_TILT_SERVO_ID&0x00FF,base_address+HEAD_TRACKING_TILT_SERVO_ID_OFFSET};
+
+
+#endif
+
diff --git a/dynamixel_manager/include/modules/joint_motion_mm_registers.h b/dynamixel_manager/include/modules/joint_motion_mm_registers.h
deleted file mode 100644
index a9e8e90a970620044f7f7c82d3712cb703d7ce14..0000000000000000000000000000000000000000
--- a/dynamixel_manager/include/modules/joint_motion_mm_registers.h
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef _JOINT_MOTION_MM_REGISTERS_H
-#define _JOINT_MOTION_MM_REGISTERS_H
-
-#define RAM_JOINT_MOTION_MM_LENGTH                 (5*NUM_JOINT_GROUPS+DYN_MANAGER_MAX_NUM_DEVICES*4)
-
-#define JOINT_MOTION_MM_GROUP_CONTROL_OFFSET       0
-  #define JOINT_MOTION_MM_START                    0x01
-  #define JOINT_MOTION_MM_STOP                     0x02
-  #define JOINT_MOTION_MM_RUNNING                  0x80
-#define JOINT_MOTION_MM_GROUP_SERVOS_OFFSET        NUM_JOINT_GROUPS 
-#define JOINT_MOTION_MM_SERVO_ANGLES_OFFSET        (5*NUM_JOINT_GROUPS)
-#define JOINT_MOTION_MM_SERVO_SPEEDS_OFFSET        (5*NUM_JOINT_GROUPS)+DYN_MANAGER_MAX_NUM_DEVICES*2
-#define JOINT_MOTION_MM_SERVO_ACCELS_OFFSET        (5*NUM_JOINT_GROUPS)+DYN_MANAGER_MAX_NUM_DEVICES*3
-
-#endif
-
diff --git a/dynamixel_manager/include/modules/joint_motion_registers.h b/dynamixel_manager/include/modules/joint_motion_registers.h
new file mode 100644
index 0000000000000000000000000000000000000000..dd47f967fb60c01535ed52d5b33c13f60a78cdfe
--- /dev/null
+++ b/dynamixel_manager/include/modules/joint_motion_registers.h
@@ -0,0 +1,16 @@
+#ifndef _JOINT_MOTION_REGISTERS_H
+#define _JOINT_MOTION_REGISTERS_H
+
+#define RAM_JOINT_MOTION_LENGTH                 (5*NUM_JOINT_GROUPS+DYN_MANAGER_MAX_NUM_DEVICES*4)
+
+#define JOINT_MOTION_GROUP_CONTROL_OFFSET       0
+  #define JOINT_MOTION_START                    0x01
+  #define JOINT_MOTION_STOP                     0x02
+  #define JOINT_MOTION_RUNNING                  0x80
+#define JOINT_MOTION_GROUP_SERVOS_OFFSET        NUM_JOINT_GROUPS 
+#define JOINT_MOTION_SERVO_ANGLES_OFFSET        (5*NUM_JOINT_GROUPS)
+#define JOINT_MOTION_SERVO_SPEEDS_OFFSET        (5*NUM_JOINT_GROUPS)+DYN_MANAGER_MAX_NUM_DEVICES*2
+#define JOINT_MOTION_SERVO_ACCELS_OFFSET        (5*NUM_JOINT_GROUPS)+DYN_MANAGER_MAX_NUM_DEVICES*3
+
+#endif
+
diff --git a/dynamixel_manager/include/modules/old/head_tracking.h b/dynamixel_manager/include/modules/old/head_tracking.h
deleted file mode 100644
index f5562649aa1bc791cf19d7e402df00d8e5f18c62..0000000000000000000000000000000000000000
--- a/dynamixel_manager/include/modules/old/head_tracking.h
+++ /dev/null
@@ -1,41 +0,0 @@
-#ifndef _HEAD_TRACKING_H
-#define _HEAD_TRACKINH_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "stm32f1xx.h"
-#include "motion_manager.h"
-
-// public functions
-void head_tracking_init(uint16_t period_us);
-void head_tracking_set_period(uint16_t period_us);
-uint16_t head_tracking_get_period(void);
-void head_tracking_start(void);
-void head_tracking_stop(void);
-uint8_t head_is_tracking(void);
-void head_tracking_set_pan_range(int16_t max_angle,int16_t min_angle);
-void head_tracking_get_pan_range(int16_t *max_angle,int16_t *min_angle);
-void head_tracking_set_pan_pid(uint16_t kp,uint16_t ki,uint16_t kd, uint16_t i_clamp);
-void head_tracking_get_pan_pid(uint16_t *kp,uint16_t *ki,uint16_t *kd, uint16_t *i_clamp);
-void head_tracking_set_tilt_range(int16_t max_angle,int16_t min_angle);
-void head_tracking_get_tilt_range(int16_t *max_angle,int16_t *min_angle);
-void head_tracking_set_tilt_pid(uint16_t kp,uint16_t ki,uint16_t kd, uint16_t i_clamp);
-void head_tracking_get_tilt_pid(uint16_t *kp,uint16_t *ki,uint16_t *kd, uint16_t *i_clamp);
-void head_tracking_set_target_pan(int16_t target);
-void head_tracking_set_target_tilt(int16_t target);
-
-// operation functions
-uint8_t head_tracking_in_range(unsigned short int address, unsigned short int length);
-void head_tracking_process_read_cmd(unsigned short int address,unsigned short int length,unsigned char *data);
-void head_tracking_process_write_cmd(unsigned short int address,unsigned short int length,unsigned char *data);
-
-// motion manager process function
-void head_tracking_process(void);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/dynamixel_manager/src/modules/action.c b/dynamixel_manager/src/modules/action.c
index e901e01264cd3153a919c00899412317c73b4373..47203899fd870bb6c03732e5ff30afdcda2a2eb2 100755
--- a/dynamixel_manager/src/modules/action.c
+++ b/dynamixel_manager/src/modules/action.c
@@ -1,5 +1,5 @@
 #include "action.h"
-#include "action_mm_registers.h"
+#include "action_registers.h"
 #include "ram.h"
 
 #define SPEED_BASE_SCHEDULE 0x00
@@ -11,15 +11,15 @@ void action_write_cmd(TActionMModule *module,unsigned short int address,unsigned
   unsigned int ram_offset;
 
   ram_offset=address-module->ram_base_address;
-  if(ram_in_range(module->ram_base_address+ACTION_MM_CONTROL_OFFSET,address,length))
+  if(ram_in_range(module->ram_base_address+ACTION_CONTROL_OFFSET,address,length))
   {
-    if(data[ACTION_MM_CONTROL_OFFSET-ram_offset]&ACTION_MM_START)
+    if(data[ACTION_CONTROL_OFFSET-ram_offset]&ACTION_START)
       action_start_page(module);
-    if(data[ACTION_MM_CONTROL_OFFSET-ram_offset]&ACTION_MM_STOP)
+    if(data[ACTION_CONTROL_OFFSET-ram_offset]&ACTION_STOP)
       action_stop_page(module);
   }
-  if(ram_in_range(module->ram_base_address+ACTION_MM_PAGE_OFFSET,address,length))// load the page identifier 
-    action_load_page(module,data[ACTION_MM_PAGE_OFFSET-ram_offset]);
+  if(ram_in_range(module->ram_base_address+ACTION_PAGE_OFFSET,address,length))// load the page identifier 
+    action_load_page(module,data[ACTION_PAGE_OFFSET-ram_offset]);
 }
 
 void action_read_cmd(TActionMModule *module,unsigned short int address,unsigned short int length,unsigned char *data)
@@ -213,7 +213,7 @@ void action_finish(TActionMModule *action)
   action->end=0x00;
   // change the internal state 
   action->running=0x00;
-  action->memory->data[action->ram_base_address+ACTION_MM_CONTROL_OFFSET]&=(~ACTION_MM_RUNNING);
+  action->memory->data[action->ram_base_address+ACTION_CONTROL_OFFSET]&=(~ACTION_RUNNING);
 }
 
 void action_set_period(void *module,unsigned short int period_ms)
@@ -496,7 +496,7 @@ unsigned char action_init(TActionMModule *action,TMemory *memory,unsigned short
   action->mem_module.data=action;
   action->mem_module.write_cmd=(void(*)(void *,unsigned short int, unsigned short int,unsigned char *))action_write_cmd;
   action->mem_module.read_cmd=(void(*)(void *,unsigned short int, unsigned short int,unsigned char *))action_read_cmd;
-  if(!mem_module_add_ram_segment(&action->mem_module,ram_base_address,RAM_ACTION_MM_LENGTH))
+  if(!mem_module_add_ram_segment(&action->mem_module,ram_base_address,RAM_ACTION_LENGTH))
     return 0x00;
   if(!mem_add_module(memory,&action->mem_module))
     return 0x00;
@@ -520,7 +520,7 @@ unsigned char action_load_page(TActionMModule *action,unsigned char page_id)
     return 0x00;
   if(!pages_check_checksum(&action->next_page))
     return 0x00;
-  action->memory->data[action->ram_base_address+ACTION_MM_PAGE_OFFSET]=page_id;
+  action->memory->data[action->ram_base_address+ACTION_PAGE_OFFSET]=page_id;
 
   return 0x01;
 }
@@ -537,7 +537,7 @@ void action_start_page(TActionMModule *action)
   action->current_step_index=-1;
   /* clear the interrupt flag */
   action->running=0x01;
-  action->memory->data[action->ram_base_address+ACTION_MM_CONTROL_OFFSET]|=ACTION_MM_RUNNING;
+  action->memory->data[action->ram_base_address+ACTION_CONTROL_OFFSET]|=ACTION_RUNNING;
 }
 
 void action_stop_page(TActionMModule *action)
diff --git a/dynamixel_manager/src/modules/head_tracking.c b/dynamixel_manager/src/modules/head_tracking.c
new file mode 100644
index 0000000000000000000000000000000000000000..1487fa08bad16e8c6dab3fd2226339527bf3d34f
--- /dev/null
+++ b/dynamixel_manager/src/modules/head_tracking.c
@@ -0,0 +1,361 @@
+#include "head_tracking.h"
+#include "head_tracking_registers.h"
+#include "ram.h"
+
+// provate functions
+void head_tracking_read_cmd(THeadMModule *module,unsigned short int address,unsigned short int length,unsigned char *data)
+{
+  ram_read_table(module->memory,address,length,data);
+}
+
+void head_tracking_write_cmd(THeadMModule *module,unsigned short int address,unsigned short int length,unsigned char *data)
+{
+  unsigned short int kp,kd,ki,i_clamp,ram_offset,eeprom_offset;
+  short int max,min,target;
+
+  eeprom_offset=address-module->eeprom_base_address;
+  if(ram_in_window(module->eeprom_base_address+HEAD_TRACKING_PAN_P_GAIN_OFFSET,8,address,length))
+  {
+    head_tracking_get_pan_pid(module,&kp,&kd,&ki,&i_clamp);
+    if(ram_in_range(module->eeprom_base_address+HEAD_TRACKING_PAN_P_GAIN_OFFSET,address,length))
+      kp=(kp&0xFF00)|data[HEAD_TRACKING_PAN_P_GAIN_OFFSET-eeprom_offset];
+    if(ram_in_range(module->eeprom_base_address+HEAD_TRACKING_PAN_P_GAIN_OFFSET+1,address,length))
+      kp=(kp&0x00FF)|(data[HEAD_TRACKING_PAN_P_GAIN_OFFSET+1-eeprom_offset]<<8);
+    if(ram_in_range(module->eeprom_base_address+HEAD_TRACKING_PAN_I_GAIN_OFFSET,address,length))
+      ki=(kp&0xFF00)|data[HEAD_TRACKING_PAN_I_GAIN_OFFSET-eeprom_offset];
+    if(ram_in_range(module->eeprom_base_address+HEAD_TRACKING_PAN_I_GAIN_OFFSET+1,address,length))
+      ki=(kp&0x00FF)|(data[HEAD_TRACKING_PAN_I_GAIN_OFFSET+1-eeprom_offset]<<8);
+    if(ram_in_range(module->eeprom_base_address+HEAD_TRACKING_PAN_D_GAIN_OFFSET,address,length))
+      kd=(kp&0xFF00)|data[HEAD_TRACKING_PAN_D_GAIN_OFFSET-eeprom_offset];
+    if(ram_in_range(module->eeprom_base_address+HEAD_TRACKING_PAN_D_GAIN_OFFSET+1,address,length))
+      kd=(kp&0x00FF)|(data[HEAD_TRACKING_PAN_D_GAIN_OFFSET+1-eeprom_offset]<<8);
+    if(ram_in_range(module->eeprom_base_address+HEAD_TRACKING_PAN_I_CLAMP_OFFSET,address,length))
+      i_clamp=(kp&0xFF00)|data[HEAD_TRACKING_PAN_I_CLAMP_OFFSET-eeprom_offset];
+    if(ram_in_range(module->eeprom_base_address+HEAD_TRACKING_PAN_I_CLAMP_OFFSET+1,address,length))
+      i_clamp=(kp&0x00FF)|(data[HEAD_TRACKING_PAN_I_CLAMP_OFFSET+1-eeprom_offset]<<8);
+    head_tracking_set_pan_pid(module,kp,kd,ki,i_clamp);
+  }
+  if(ram_in_window(module->eeprom_base_address+HEAD_TRACKING_TILT_P_GAIN_OFFSET,8,address,length))
+  {
+    head_tracking_get_tilt_pid(module,&kp,&kd,&ki,&i_clamp);
+    if(ram_in_range(module->eeprom_base_address+HEAD_TRACKING_TILT_P_GAIN_OFFSET,address,length))
+      kp=(kp&0xFF00)|data[HEAD_TRACKING_TILT_P_GAIN_OFFSET-eeprom_offset];
+    if(ram_in_range(module->eeprom_base_address+HEAD_TRACKING_TILT_P_GAIN_OFFSET+1,address,length))
+      kp=(kp&0x00FF)|(data[HEAD_TRACKING_TILT_P_GAIN_OFFSET+1-eeprom_offset]<<8);
+    if(ram_in_range(module->eeprom_base_address+HEAD_TRACKING_TILT_I_GAIN_OFFSET,address,length))
+      ki=(kp&0xFF00)|data[HEAD_TRACKING_TILT_I_GAIN_OFFSET-eeprom_offset];
+    if(ram_in_range(module->eeprom_base_address+HEAD_TRACKING_TILT_I_GAIN_OFFSET+1,address,length))
+      ki=(kp&0x00FF)|(data[HEAD_TRACKING_TILT_I_GAIN_OFFSET+1-eeprom_offset]<<8);
+    if(ram_in_range(module->eeprom_base_address+HEAD_TRACKING_TILT_D_GAIN_OFFSET,address,length))
+      kd=(kp&0xFF00)|data[HEAD_TRACKING_TILT_D_GAIN_OFFSET-eeprom_offset];
+    if(ram_in_range(module->eeprom_base_address+HEAD_TRACKING_TILT_D_GAIN_OFFSET+1,address,length))
+      kd=(kp&0x00FF)|(data[HEAD_TRACKING_TILT_D_GAIN_OFFSET+1-eeprom_offset]<<8);
+    if(ram_in_range(module->eeprom_base_address+HEAD_TRACKING_TILT_I_CLAMP_OFFSET,address,length))
+      i_clamp=(kp&0xFF00)|data[HEAD_TRACKING_TILT_I_CLAMP_OFFSET-eeprom_offset];
+    if(ram_in_range(module->eeprom_base_address+HEAD_TRACKING_TILT_I_CLAMP_OFFSET+1,address,length))
+      i_clamp=(kp&0x00FF)|(data[HEAD_TRACKING_TILT_I_CLAMP_OFFSET+1-eeprom_offset]<<8);
+    head_tracking_set_tilt_pid(module,kp,kd,ki,i_clamp);
+  }
+  if(ram_in_range(module->eeprom_base_address+HEAD_TRACKING_PAN_SERVO_ID_OFFSET,address,length))
+    head_tracking_set_pan_servo_id(module,data[HEAD_TRACKING_PAN_SERVO_ID_OFFSET-eeprom_offset]);
+  if(ram_in_range(module->eeprom_base_address+HEAD_TRACKING_TILT_SERVO_ID_OFFSET,address,length))
+    head_tracking_set_tilt_servo_id(module,data[HEAD_TRACKING_TILT_SERVO_ID_OFFSET-eeprom_offset]);
+ 
+  // head tracking control
+  ram_offset=address-module->ram_base_address;
+  if(ram_in_range(module->ram_base_address+HEAD_TRACKING_CONTROL_OFFSET,address,length))
+  {
+    if(data[HEAD_TRACKING_CONTROL_OFFSET-ram_offset]&HEAD_TRACKING_START)
+      head_tracking_start(module);
+    if(data[HEAD_TRACKING_CONTROL_OFFSET-ram_offset]&HEAD_TRACKING_STOP)
+      head_tracking_stop(module);
+  }
+  if(ram_in_window(module->ram_base_address+HEAD_TRACKING_MAX_PAN_OFFSET,4,address,length))
+  {
+    head_tracking_get_pan_range(module,&max,&min);
+    if(ram_in_range(module->ram_base_address+HEAD_TRACKING_MAX_PAN_OFFSET,address,length)) 
+      max=(max&0xFF00)|data[HEAD_TRACKING_MAX_PAN_OFFSET-ram_offset];
+    if(ram_in_range(module->ram_base_address+HEAD_TRACKING_MAX_PAN_OFFSET+1,address,length))
+      max=(max&0x00FF)|(data[HEAD_TRACKING_MAX_PAN_OFFSET+1-ram_offset]<<8);
+    if(ram_in_range(module->ram_base_address+HEAD_TRACKING_MIN_PAN_OFFSET,address,length)) 
+      max=(max&0xFF00)|data[HEAD_TRACKING_MIN_PAN_OFFSET-ram_offset];
+    if(ram_in_range(module->ram_base_address+HEAD_TRACKING_MIN_PAN_OFFSET+1,address,length))
+      max=(max&0x00FF)|(data[HEAD_TRACKING_MIN_PAN_OFFSET+1-ram_offset]<<8);
+    head_tracking_set_pan_range(module,max,min);
+  }
+  if(ram_in_window(module->ram_base_address+HEAD_TRACKING_MAX_TILT_OFFSET,4,address,length))
+  {
+    head_tracking_get_tilt_range(module,&max,&min);
+    if(ram_in_range(module->ram_base_address+HEAD_TRACKING_MAX_TILT_OFFSET,address,length)) 
+      max=(max&0xFF00)|data[HEAD_TRACKING_MAX_TILT_OFFSET-ram_offset];
+    if(ram_in_range(module->ram_base_address+HEAD_TRACKING_MAX_TILT_OFFSET+1,address,length))
+      max=(max&0x00FF)|(data[HEAD_TRACKING_MAX_TILT_OFFSET+1-ram_offset]<<8);
+    if(ram_in_range(module->ram_base_address+HEAD_TRACKING_MIN_TILT_OFFSET,address,length)) 
+      max=(max&0xFF00)|data[HEAD_TRACKING_MIN_TILT_OFFSET-ram_offset];
+    if(ram_in_range(module->ram_base_address+HEAD_TRACKING_MIN_TILT_OFFSET+1,address,length))
+      max=(max&0x00FF)|(data[HEAD_TRACKING_MIN_TILT_OFFSET+1-ram_offset]<<8);
+    head_tracking_set_tilt_range(module,max,min);
+  }
+  if(ram_in_window(module->ram_base_address+HEAD_TRACKING_PAN_TARGET_OFFSET,2,address,length))
+  {
+    target=(module->tracking_pan.target_angle>>9);
+    if(ram_in_range(module->ram_base_address+HEAD_TRACKING_PAN_TARGET_OFFSET,address,length))
+    { 
+      target=(target&0xFF00)|data[HEAD_TRACKING_PAN_TARGET_OFFSET-ram_offset];
+      module->memory->data[module->ram_base_address+HEAD_TRACKING_PAN_TARGET_OFFSET]=data[HEAD_TRACKING_PAN_TARGET_OFFSET-ram_offset];
+    }
+    if(ram_in_range(module->ram_base_address+HEAD_TRACKING_PAN_TARGET_OFFSET+1,address,length))
+    {
+      target=(target&0x00FF)|(data[HEAD_TRACKING_PAN_TARGET_OFFSET+1-ram_offset]<<8);
+      module->memory->data[module->ram_base_address+HEAD_TRACKING_PAN_TARGET_OFFSET]=data[HEAD_TRACKING_PAN_TARGET_OFFSET-ram_offset];
+    }
+    module->tracking_pan.target_angle=(target<<9);
+  }
+  if(ram_in_window(module->ram_base_address+HEAD_TRACKING_TILT_TARGET_OFFSET,2,address,length))
+  {
+    target=(module->tracking_tilt.target_angle>>9);
+    if(ram_in_range(module->ram_base_address+HEAD_TRACKING_TILT_TARGET_OFFSET,address,length))
+    { 
+      target=(target&0xFF00)|data[HEAD_TRACKING_TILT_TARGET_OFFSET-ram_offset];
+      module->memory->data[module->ram_base_address+HEAD_TRACKING_TILT_TARGET_OFFSET]=data[HEAD_TRACKING_TILT_TARGET_OFFSET-ram_offset];
+    }
+    if(ram_in_range(module->ram_base_address+HEAD_TRACKING_TILT_TARGET_OFFSET+1,address,length))
+    {
+      target=(target&0x00FF)|(data[HEAD_TRACKING_TILT_TARGET_OFFSET+1-ram_offset]<<8);
+      module->memory->data[module->ram_base_address+HEAD_TRACKING_TILT_TARGET_OFFSET]=data[HEAD_TRACKING_TILT_TARGET_OFFSET-ram_offset];
+    }
+    module->tracking_tilt.target_angle=(target<<9);
+  }
+}
+
+TMotionModule *head_tracking_get_module(THeadMModule *head)
+{
+  return &head->mmodule;
+}
+
+void head_tracking_set_period(void *module,unsigned short int period_ms)
+{
+  THeadMModule *head=(THeadMModule *)module;
+
+  // load the current period 
+  head->tracking_period=(period_ms<<16)/1000;
+  head->tracking_period_ms=period_ms;
+}
+
+void head_tracking_set_module(void *module,unsigned char servo_id)
+{
+
+}
+
+// motion manager process function
+void head_tracking_pre_process(void *module)
+{
+  THeadMModule *head=(THeadMModule *)module;
+  long int pan_error, tilt_error;
+  long int derivative_pan=0, derivative_tilt=0;
+
+  if(head->tracking_enabled)
+  {
+    head->memory->data[head->ram_base_address+HEAD_TRACKING_CONTROL_OFFSET]|=HEAD_TRACKING_RUNNING;
+    if(mmanager_get_module(head->mmodule.manager,head->pan_servo_id)==MM_HEAD)
+    {
+      pan_error=head->tracking_pan.target_angle-head->mmodule.manager->servo_values[head->pan_servo_id].target_angle;
+      head->tracking_pan.integral_part+=(pan_error*head->tracking_period)>>16;
+      if(head->tracking_pan.integral_part>head->tracking_pan.integral_clamp)
+        head->tracking_pan.integral_part=head->tracking_pan.integral_clamp;
+      else if(head->tracking_pan.integral_part<-head->tracking_pan.integral_clamp)
+        head->tracking_pan.integral_part=-head->tracking_pan.integral_clamp;
+      derivative_pan=((pan_error-head->tracking_pan.prev_error)<<16)/head->tracking_period;
+      head->mmodule.manager->servo_values[head->pan_servo_id].target_angle+=((head->tracking_pan.kp*pan_error)>>16);
+      head->mmodule.manager->servo_values[head->pan_servo_id].target_angle+=((head->tracking_pan.ki*head->tracking_pan.integral_part)>>16);      
+      head->mmodule.manager->servo_values[head->pan_servo_id].target_angle+=((head->tracking_pan.kd*derivative_pan)>>16);      
+      if(head->mmodule.manager->servo_values[head->pan_servo_id].target_angle>head->tracking_pan.max_angle)
+        head->mmodule.manager->servo_values[head->pan_servo_id].target_angle=head->tracking_pan.max_angle;
+      else if(head->mmodule.manager->servo_values[head->pan_servo_id].target_angle<head->tracking_pan.min_angle)
+        head->mmodule.manager->servo_values[head->pan_servo_id].target_angle=head->tracking_pan.min_angle;
+      head->tracking_pan.prev_error=pan_error;
+    }
+    if(mmanager_get_module(head->mmodule.manager,head->tilt_servo_id)==MM_HEAD)
+    { 
+      tilt_error=head->tracking_tilt.target_angle-head->mmodule.manager->servo_values[head->tilt_servo_id].target_angle;
+      head->tracking_tilt.integral_part+=(tilt_error*head->tracking_period)>>16;
+      if(head->tracking_tilt.integral_part>head->tracking_tilt.integral_clamp)
+        head->tracking_tilt.integral_part=head->tracking_tilt.integral_clamp;
+      else if(head->tracking_tilt.integral_part<-head->tracking_tilt.integral_clamp)
+        head->tracking_tilt.integral_part=-head->tracking_tilt.integral_clamp;
+      derivative_tilt=((tilt_error-head->tracking_tilt.prev_error)<<16)/head->tracking_period;
+      head->mmodule.manager->servo_values[head->tilt_servo_id].target_angle+=((head->tracking_tilt.kp*tilt_error)>>16);
+      head->mmodule.manager->servo_values[head->tilt_servo_id].target_angle+=((head->tracking_tilt.ki*head->tracking_tilt.integral_part)>>16);
+      head->mmodule.manager->servo_values[head->tilt_servo_id].target_angle+=((head->tracking_tilt.kd*derivative_tilt)>>16);
+      if(head->mmodule.manager->servo_values[head->tilt_servo_id].target_angle>head->tracking_tilt.max_angle)
+        head->mmodule.manager->servo_values[head->tilt_servo_id].target_angle=head->tracking_tilt.max_angle;
+      else if(head->mmodule.manager->servo_values[head->tilt_servo_id].target_angle<head->tracking_tilt.min_angle)
+        head->mmodule.manager->servo_values[head->tilt_servo_id].target_angle=head->tracking_tilt.min_angle;
+      head->tracking_tilt.prev_error=tilt_error;
+    }
+  }
+  else
+    head->memory->data[head->ram_base_address+HEAD_TRACKING_CONTROL_OFFSET]&=(~HEAD_TRACKING_RUNNING);
+}
+
+// public functions
+unsigned char head_tracking_init(THeadMModule *head,TMemory *memory,unsigned short int ram_base_address,unsigned short int eeprom_base_address)
+{
+  /* initialize private variables */
+  head->tracking_pan.prev_error=0;
+  head->tracking_pan.integral_part=0;
+  head->tracking_pan.target_angle=0;
+  head->tracking_tilt.prev_error=0;
+  head->tracking_tilt.integral_part=0;
+  head->tracking_tilt.target_angle=0;
+  head->tracking_enabled=0x00;
+
+  /* initialize the motion module */
+  mmodule_init(&head->mmodule);
+  head->mmodule.id=MM_JOINTS;
+  head->mmodule.set_period=head_tracking_set_period;
+  head->mmodule.set_module=head_tracking_set_module;
+  head->mmodule.pre_process=head_tracking_pre_process;
+  head->mmodule.data=head;
+
+  mem_module_init(&head->mem_module);
+  head->mem_module.data=head;
+  head->mem_module.write_cmd=(void(*)(void *,unsigned short int, unsigned short int,unsigned char *))head_tracking_write_cmd;
+  head->mem_module.read_cmd=(void(*)(void *,unsigned short int, unsigned short int,unsigned char *))head_tracking_read_cmd;
+  if(!mem_module_add_ram_segment(&head->mem_module,ram_base_address,RAM_HEAD_TRACKING_LENGTH))
+    return 0x00;
+  if(!mem_module_add_eeprom_segment(&head->mem_module,eeprom_base_address,EEPROM_HEAD_TRACKING_LENGTH))
+    return 0x00;
+  if(!mem_add_module(memory,&head->mem_module))
+    return 0x00;
+  head->ram_base_address=ram_base_address;
+  head->eeprom_base_address=eeprom_base_address;
+  head->memory=memory;
+
+  return 0x01;
+}
+
+void head_tracking_start(THeadMModule *head)
+{
+  head->tracking_enabled=0x01;
+  head->memory->data[head->ram_base_address+HEAD_TRACKING_CONTROL_OFFSET]|=HEAD_TRACKING_RUNNING;
+  head_tracking_set_pan_range(head,head->mmodule.manager->servo_configs[head->pan_servo_id]->ccw_angle_limit<<9,head->mmodule.manager->servo_configs[head->pan_servo_id]->cw_angle_limit<<9);
+  head_tracking_set_pan_range(head,head->mmodule.manager->servo_configs[head->tilt_servo_id]->ccw_angle_limit<<9,head->mmodule.manager->servo_configs[head->tilt_servo_id]->cw_angle_limit<<9);
+}
+
+void head_tracking_stop(THeadMModule *head)
+{
+  head->tracking_enabled=0x00;
+  head->memory->data[head->ram_base_address+HEAD_TRACKING_CONTROL_OFFSET]&=(~HEAD_TRACKING_RUNNING);
+}
+
+unsigned char head_is_tracking(THeadMModule *head)
+{
+  return head->tracking_enabled;
+}
+
+void head_tracking_set_pan_range(THeadMModule *head,short int max_angle,short int min_angle)
+{
+  head->tracking_pan.max_angle=max_angle<<9;
+  head->memory->data[head->ram_base_address+HEAD_TRACKING_MAX_PAN_OFFSET]=max_angle&0x00FF;
+  head->memory->data[head->ram_base_address+HEAD_TRACKING_MAX_PAN_OFFSET+1]=(max_angle>>8)&0x00FF;
+  head->tracking_pan.min_angle=min_angle<<9;
+  head->memory->data[head->ram_base_address+HEAD_TRACKING_MIN_PAN_OFFSET]=min_angle&0x00FF;
+  head->memory->data[head->ram_base_address+HEAD_TRACKING_MIN_PAN_OFFSET+1]=(min_angle>>8)&0x00FF;
+}
+
+void head_tracking_get_pan_range(THeadMModule *head,short int *max_angle,short int *min_angle)
+{
+  *max_angle=head->tracking_pan.max_angle>>9;
+  *min_angle=head->tracking_pan.min_angle>>9;
+}
+
+void head_tracking_set_pan_pid(THeadMModule *head,unsigned short int kp,unsigned short int ki,unsigned short int kd, unsigned short int i_clamp)
+{
+  head->tracking_pan.kp=kp;
+  head->memory->data[head->eeprom_base_address+HEAD_TRACKING_PAN_P_GAIN_OFFSET]=kp&0x00FF;
+  head->memory->data[head->eeprom_base_address+HEAD_TRACKING_PAN_P_GAIN_OFFSET+1]=(kp>>8)&0x00FF;
+  head->tracking_pan.ki=ki;
+  head->memory->data[head->eeprom_base_address+HEAD_TRACKING_PAN_I_GAIN_OFFSET]=ki&0x00FF;
+  head->memory->data[head->eeprom_base_address+HEAD_TRACKING_PAN_I_GAIN_OFFSET+1]=(ki>>8)&0x00FF;
+  head->tracking_pan.kd=kd;
+  head->memory->data[head->eeprom_base_address+HEAD_TRACKING_PAN_D_GAIN_OFFSET]=kd&0x00FF;
+  head->memory->data[head->eeprom_base_address+HEAD_TRACKING_PAN_D_GAIN_OFFSET+1]=(kd>>8)&0x00FF;
+  head->tracking_pan.integral_clamp=i_clamp<<9;
+  head->memory->data[head->eeprom_base_address+HEAD_TRACKING_PAN_I_CLAMP_OFFSET]=i_clamp&0x00FF;
+  head->memory->data[head->eeprom_base_address+HEAD_TRACKING_PAN_I_CLAMP_OFFSET+1]=(i_clamp>>8)&0x00FF;
+}
+
+void head_tracking_get_pan_pid(THeadMModule *head,unsigned short int *kp,unsigned short int *ki,unsigned short int *kd, unsigned short int *i_clamp)
+{
+  *kp=head->tracking_pan.kp;
+  *ki=head->tracking_pan.ki;
+  *kd=head->tracking_pan.kd;
+  *i_clamp=head->tracking_pan.integral_clamp>>9;
+}
+
+void head_tracking_set_tilt_range(THeadMModule *head,short int max_angle,short int min_angle)
+{
+  head->tracking_tilt.max_angle=max_angle<<9;
+  head->memory->data[head->ram_base_address+HEAD_TRACKING_MAX_TILT_OFFSET]=max_angle&0x00FF;
+  head->memory->data[head->ram_base_address+HEAD_TRACKING_MAX_TILT_OFFSET+1]=(max_angle>>8)&0x00FF;
+  head->tracking_tilt.min_angle=min_angle<<9;
+  head->memory->data[head->ram_base_address+HEAD_TRACKING_MAX_TILT_OFFSET]=min_angle&0x00FF;
+  head->memory->data[head->ram_base_address+HEAD_TRACKING_MAX_TILT_OFFSET+1]=(min_angle>>8)&0x00FF;
+}
+
+void head_tracking_get_tilt_range(THeadMModule *head,short int *max_angle,short int *min_angle)
+{
+  *max_angle=head->tracking_tilt.max_angle>>9;
+  *min_angle=head->tracking_tilt.min_angle>>9;
+}
+
+void head_tracking_set_tilt_pid(THeadMModule *head,unsigned short int kp,unsigned short int ki,unsigned short int kd, unsigned short int i_clamp)
+{
+  head->tracking_tilt.kp=kp;
+  head->memory->data[head->eeprom_base_address+HEAD_TRACKING_TILT_P_GAIN_OFFSET]=kp&0x00FF;
+  head->memory->data[head->eeprom_base_address+HEAD_TRACKING_TILT_P_GAIN_OFFSET+1]=(kp>>8)&0x00FF;
+  head->tracking_tilt.ki=ki;
+  head->memory->data[head->eeprom_base_address+HEAD_TRACKING_TILT_I_GAIN_OFFSET]=ki&0x00FF;
+  head->memory->data[head->eeprom_base_address+HEAD_TRACKING_TILT_I_GAIN_OFFSET+1]=(ki>>8)&0x00FF;
+  head->tracking_tilt.kd=kd;
+  head->memory->data[head->eeprom_base_address+HEAD_TRACKING_TILT_D_GAIN_OFFSET]=kd&0x00FF;
+  head->memory->data[head->eeprom_base_address+HEAD_TRACKING_TILT_D_GAIN_OFFSET+1]=(kd>>8)&0x00FF;
+  head->tracking_tilt.integral_clamp=i_clamp<<9;
+  head->memory->data[head->eeprom_base_address+HEAD_TRACKING_TILT_I_CLAMP_OFFSET]=i_clamp&0x00FF;
+  head->memory->data[head->eeprom_base_address+HEAD_TRACKING_TILT_I_CLAMP_OFFSET+1]=(i_clamp>>8)&0x00FF;
+}
+
+void head_tracking_get_tilt_pid(THeadMModule *head,unsigned short int *kp,unsigned short int *ki,unsigned short int *kd, unsigned short int *i_clamp)
+{
+  *kp=head->tracking_tilt.kp;
+  *ki=head->tracking_tilt.ki;
+  *kd=head->tracking_tilt.kd;
+  *i_clamp=head->tracking_tilt.integral_clamp>>9;
+}
+
+void head_tracking_set_pan_target(THeadMModule *head,short int target)
+{
+  head->tracking_pan.target_angle=target<<9;
+  head->memory->data[head->ram_base_address+HEAD_TRACKING_PAN_TARGET_OFFSET]=target&0x00FF;
+  head->memory->data[head->ram_base_address+HEAD_TRACKING_PAN_TARGET_OFFSET+1]=(target>>8)&0x00FF;
+}
+
+void head_tracking_set_tilt_target(THeadMModule *head,short int target)
+{
+  head->tracking_tilt.target_angle=target<<9;
+  head->memory->data[head->ram_base_address+HEAD_TRACKING_TILT_TARGET_OFFSET]=target&0x00FF;
+  head->memory->data[head->ram_base_address+HEAD_TRACKING_TILT_TARGET_OFFSET+1]=(target>>8)&0x00FF;
+}
+
+void head_tracking_set_pan_servo_id(THeadMModule *head,unsigned char servo_id)
+{
+  head->pan_servo_id=servo_id;
+  head->memory->data[head->eeprom_base_address+HEAD_TRACKING_PAN_SERVO_ID_OFFSET]=servo_id;
+}
+
+void head_tracking_set_tilt_servo_id(THeadMModule *head,unsigned char servo_id)
+{
+  head->tilt_servo_id=servo_id;
+  head->memory->data[head->eeprom_base_address+HEAD_TRACKING_TILT_SERVO_ID_OFFSET]=servo_id;
+}
diff --git a/dynamixel_manager/src/modules/joint_motion.c b/dynamixel_manager/src/modules/joint_motion.c
index 332b080cfcfbaf55a4f61e24f3aecf9e7503cfb2..ebbe9eb9a13e5a697ea551ebd4e4dd3fb0eb4fed 100644
--- a/dynamixel_manager/src/modules/joint_motion.c
+++ b/dynamixel_manager/src/modules/joint_motion.c
@@ -1,5 +1,5 @@
 #include "joint_motion.h"
-#include "joint_motion_mm_registers.h"
+#include "joint_motion_registers.h"
 #include "ram.h"
 #include <stdlib.h>
 
@@ -18,24 +18,24 @@ void joint_motion_write_cmd(TJointMModule *module,unsigned short int address,uns
   // load motion information
   ram_offset=address-module->ram_base_address;
   for(i=0;i<DYN_MANAGER_MAX_NUM_DEVICES*4;i++)
-    if(ram_in_range(module->ram_base_address+JOINT_MOTION_MM_SERVO_ANGLES_OFFSET+i,address,length))
-      module->memory->data[i]=data[JOINT_MOTION_MM_SERVO_ANGLES_OFFSET+i-ram_offset];
+    if(ram_in_range(module->ram_base_address+JOINT_MOTION_SERVO_ANGLES_OFFSET+i,address,length))
+      module->memory->data[i]=data[JOINT_MOTION_SERVO_ANGLES_OFFSET+i-ram_offset];
   // group servos
   for(j=0;j<NUM_JOINT_GROUPS;j++)
   {
-    if(ram_in_window(module->ram_base_address+JOINT_MOTION_MM_GROUP_SERVOS_OFFSET+j*4,4,address,length))
+    if(ram_in_window(module->ram_base_address+JOINT_MOTION_GROUP_SERVOS_OFFSET+j*4,4,address,length))
     {
       servos=joint_motion_get_group_servos(module,j);
       for(i=0;i<4;i++)
-        if(ram_in_range(module->ram_base_address+JOINT_MOTION_MM_GROUP_SERVOS_OFFSET+j*4+i,address,length))
-          servos|=(data[JOINT_MOTION_MM_GROUP_SERVOS_OFFSET+j*4+i-ram_offset]<<(i*8));
+        if(ram_in_range(module->ram_base_address+JOINT_MOTION_GROUP_SERVOS_OFFSET+j*4+i,address,length))
+          servos|=(data[JOINT_MOTION_GROUP_SERVOS_OFFSET+j*4+i-ram_offset]<<(i*8));
       joint_motion_set_group_servos(module,j,servos);
     }
-    if(ram_in_range(module->ram_base_address+JOINT_MOTION_MM_GROUP_CONTROL_OFFSET+j,address,length))
+    if(ram_in_range(module->ram_base_address+JOINT_MOTION_GROUP_CONTROL_OFFSET+j,address,length))
     {
-      if(data[JOINT_MOTION_MM_GROUP_CONTROL_OFFSET+j-ram_offset]&JOINT_MOTION_MM_START)
+      if(data[JOINT_MOTION_GROUP_CONTROL_OFFSET+j-ram_offset]&JOINT_MOTION_START)
         joint_motion_start(module,j);
-      if(data[JOINT_MOTION_MM_GROUP_CONTROL_OFFSET+j-ram_offset]&JOINT_MOTION_MM_STOP)
+      if(data[JOINT_MOTION_GROUP_CONTROL_OFFSET+j-ram_offset]&JOINT_MOTION_STOP)
         joint_motion_stop(module,j);
     }
   }
@@ -154,7 +154,7 @@ void joint_motion_pre_process(void *module)
       {
         joint->moving[j]=0x00;
         joint->stop[j]=0x00;
-        joint->memory->data[joint->ram_base_address+JOINT_MOTION_MM_GROUP_CONTROL_OFFSET+j]&=(~JOINT_MOTION_MM_RUNNING);
+        joint->memory->data[joint->ram_base_address+JOINT_MOTION_GROUP_CONTROL_OFFSET+j]&=(~JOINT_MOTION_RUNNING);
       }
     }
   }
@@ -197,7 +197,7 @@ unsigned char joint_motion_init(TJointMModule *joint,TMemory *memory,unsigned sh
   joint->mem_module.data=joint;
   joint->mem_module.write_cmd=(void(*)(void *,unsigned short int, unsigned short int,unsigned char *))joint_motion_write_cmd;
   joint->mem_module.read_cmd=(void(*)(void *,unsigned short int, unsigned short int,unsigned char *))joint_motion_read_cmd;
-  if(!mem_module_add_ram_segment(&joint->mem_module,ram_base_address,RAM_JOINT_MOTION_MM_LENGTH))
+  if(!mem_module_add_ram_segment(&joint->mem_module,ram_base_address,RAM_JOINT_MOTION_LENGTH))
     return 0x00;
   if(!mem_add_module(memory,&joint->mem_module))
     return 0x00;
@@ -210,10 +210,10 @@ unsigned char joint_motion_init(TJointMModule *joint,TMemory *memory,unsigned sh
 void joint_motion_set_group_servos(TJointMModule *joint,unsigned char group_id,unsigned int servos)
 {
   joint->group_servos[group_id]=servos;
-  joint->memory->data[joint->ram_base_address+JOINT_MOTION_MM_GROUP_SERVOS_OFFSET+group_id*4]=servos&0x000000FF;
-  joint->memory->data[joint->ram_base_address+JOINT_MOTION_MM_GROUP_SERVOS_OFFSET+group_id*4+1]=(servos>>8)&0x000000FF;
-  joint->memory->data[joint->ram_base_address+JOINT_MOTION_MM_GROUP_SERVOS_OFFSET+group_id*4+2]=(servos>>16)&0x000000FF;
-  joint->memory->data[joint->ram_base_address+JOINT_MOTION_MM_GROUP_SERVOS_OFFSET+group_id*4+3]=(servos>>24)&0x000000FF;
+  joint->memory->data[joint->ram_base_address+JOINT_MOTION_GROUP_SERVOS_OFFSET+group_id*4]=servos&0x000000FF;
+  joint->memory->data[joint->ram_base_address+JOINT_MOTION_GROUP_SERVOS_OFFSET+group_id*4+1]=(servos>>8)&0x000000FF;
+  joint->memory->data[joint->ram_base_address+JOINT_MOTION_GROUP_SERVOS_OFFSET+group_id*4+2]=(servos>>16)&0x000000FF;
+  joint->memory->data[joint->ram_base_address+JOINT_MOTION_GROUP_SERVOS_OFFSET+group_id*4+3]=(servos>>24)&0x000000FF;
 }
 
 unsigned int joint_motion_get_group_servos(TJointMModule *joint,unsigned char group_id)
@@ -232,33 +232,33 @@ void joint_motion_start(TJointMModule *joint,unsigned char group_id)
   {
     if(joint->group_servos[group_id]&servo_index)
     {
-      if(joint->memory->data[joint->ram_base_address+JOINT_MOTION_MM_SERVO_SPEEDS_OFFSET+i]==0)
+      if(joint->memory->data[joint->ram_base_address+JOINT_MOTION_SERVO_SPEEDS_OFFSET+i]==0)
       {
         joint->target_angles[i]=joint->mmodule.manager->servo_values[i].target_angle;
         joint->current_angles[i]=joint->mmodule.manager->servo_values[i].target_angle;
         angle=joint->mmodule.manager->servo_values[i].target_angle>>9;
-        joint->memory->data[joint->ram_base_address+JOINT_MOTION_MM_SERVO_ANGLES_OFFSET+i*2]=angle&0x00FF;
-        joint->memory->data[joint->ram_base_address+JOINT_MOTION_MM_SERVO_ANGLES_OFFSET+i*2+1]=(angle>>8)&0x00FF;
+        joint->memory->data[joint->ram_base_address+JOINT_MOTION_SERVO_ANGLES_OFFSET+i*2]=angle&0x00FF;
+        joint->memory->data[joint->ram_base_address+JOINT_MOTION_SERVO_ANGLES_OFFSET+i*2+1]=(angle>>8)&0x00FF;
       }
       else
       {
         // current values
         joint->current_angles[i]=joint->mmodule.manager->servo_values[i].target_angle;
         // target angle
-        angle=joint->memory->data[joint->ram_base_address+JOINT_MOTION_MM_SERVO_ANGLES_OFFSET+i*2]+(joint->memory->data[joint->ram_base_address+JOINT_MOTION_MM_SERVO_ANGLES_OFFSET+i*2+1]<<8);
+        angle=joint->memory->data[joint->ram_base_address+JOINT_MOTION_SERVO_ANGLES_OFFSET+i*2]+(joint->memory->data[joint->ram_base_address+JOINT_MOTION_SERVO_ANGLES_OFFSET+i*2+1]<<8);
         if(angle>joint->mmodule.manager->servo_configs[i]->ccw_angle_limit)
           angle=joint->mmodule.manager->servo_configs[i]->ccw_angle_limit;
         else if(angle<joint->mmodule.manager->servo_configs[i]->cw_angle_limit)
           angle=joint->mmodule.manager->servo_configs[i]->ccw_angle_limit;
         joint->target_angles[i]=angle<<9;
         // target speed
-        joint->target_speeds[i]=joint->memory->data[joint->ram_base_address+JOINT_MOTION_MM_SERVO_SPEEDS_OFFSET+i]<<16;
+        joint->target_speeds[i]=joint->memory->data[joint->ram_base_address+JOINT_MOTION_SERVO_SPEEDS_OFFSET+i]<<16;
         // target accel
-        joint->target_accels[i]=joint->memory->data[joint->ram_base_address+JOINT_MOTION_MM_SERVO_ACCELS_OFFSET+i]<<16;
+        joint->target_accels[i]=joint->memory->data[joint->ram_base_address+JOINT_MOTION_SERVO_ACCELS_OFFSET+i]<<16;
         if(joint->target_accels[i]==0)
         {
           joint->target_accels[i]=1<<16;
-          joint->memory->data[joint->ram_base_address+JOINT_MOTION_MM_SERVO_ACCELS_OFFSET+i]=1;
+          joint->memory->data[joint->ram_base_address+JOINT_MOTION_SERVO_ACCELS_OFFSET+i]=1;
         }
         // check the parameters
         if(abs(joint->target_angles[i]-joint->current_angles[i])>=65)
@@ -266,7 +266,7 @@ void joint_motion_start(TJointMModule *joint,unsigned char group_id)
           if((joint->target_speeds[i]*joint->target_speeds[i])/joint->target_accels[i]>abs(joint->target_angles[i]-joint->current_angles[i]))
           {
             joint->target_accels[i]=(joint->target_speeds[i]*joint->target_speeds[i])/abs(joint->target_angles[i]-joint->current_angles[i]);
-            joint->memory->data[joint->ram_base_address+JOINT_MOTION_MM_SERVO_ACCELS_OFFSET+i]=joint->target_accels[i]>>16;
+            joint->memory->data[joint->ram_base_address+JOINT_MOTION_SERVO_ACCELS_OFFSET+i]=joint->target_accels[i]>>16;
           }
         }
         // stop angles
@@ -281,7 +281,7 @@ void joint_motion_start(TJointMModule *joint,unsigned char group_id)
   }
   joint->moving[group_id]=0x01;
   joint->stop[group_id]=0x00;
-  joint->memory->data[joint->ram_base_address+JOINT_MOTION_MM_GROUP_CONTROL_OFFSET+group_id]|=JOINT_MOTION_MM_RUNNING;
+  joint->memory->data[joint->ram_base_address+JOINT_MOTION_GROUP_CONTROL_OFFSET+group_id]|=JOINT_MOTION_RUNNING;
 }
 
 void joint_motion_stop(TJointMModule *joint,unsigned char group_id)
diff --git a/dynamixel_manager/src/modules/old/head_tracking.c b/dynamixel_manager/src/modules/old/head_tracking.c
deleted file mode 100644
index 12ee27c4d4485534af863f89d724864df4104f16..0000000000000000000000000000000000000000
--- a/dynamixel_manager/src/modules/old/head_tracking.c
+++ /dev/null
@@ -1,333 +0,0 @@
-#include "head_tracking.h"
-#include "ram.h"
-
-// private variables
-typedef struct{
-  uint16_t kp;
-  uint16_t ki;
-  uint16_t kd;
-  int64_t prev_error;// 48|16
-  int64_t integral_part;
-  int64_t integral_clamp;
-  int64_t max_angle;
-  int64_t min_angle;
-  int64_t target_angle;
-}TJointControl;
-
-TJointControl head_tracking_pan;
-TJointControl head_tracking_tilt;
-int64_t head_tracking_period;
-int16_t head_tracking_period_us;
-uint8_t head_tracking_enabled;
-
-// public functions
-void head_tracking_init(uint16_t period_us)
-{
-  /* initialize private variables */
-  head_tracking_pan.kp=ram_data[DARWIN_HEAD_PAN_P_L]+(ram_data[DARWIN_HEAD_PAN_P_H]<<8);
-  head_tracking_pan.ki=ram_data[DARWIN_HEAD_PAN_I_L]+(ram_data[DARWIN_HEAD_PAN_I_H]<<8);
-  head_tracking_pan.kd=ram_data[DARWIN_HEAD_PAN_D_L]+(ram_data[DARWIN_HEAD_PAN_D_H]<<8);
-  head_tracking_pan.prev_error=0;
-  head_tracking_pan.integral_part=0;
-  head_tracking_pan.integral_clamp=(ram_data[DARWIN_HEAD_PAN_I_CLAMP_L]+(ram_data[DARWIN_HEAD_PAN_I_CLAMP_H]<<8))<<9;
-  head_tracking_pan.min_angle=manager_get_cw_angle_limit(L_PAN)<<9;
-  ram_data[DARWIN_HEAD_MIN_PAN_L]=manager_get_cw_angle_limit(L_PAN)%256;
-  ram_data[DARWIN_HEAD_MIN_PAN_H]=manager_get_cw_angle_limit(L_PAN)/256;
-  head_tracking_pan.max_angle=manager_get_ccw_angle_limit(L_PAN)<<9;
-  ram_data[DARWIN_HEAD_MAX_PAN_L]=manager_get_ccw_angle_limit(L_PAN)%256;
-  ram_data[DARWIN_HEAD_MAX_PAN_H]=manager_get_ccw_angle_limit(L_PAN)/256;
-  head_tracking_pan.target_angle=0;
-  head_tracking_tilt.kp=ram_data[DARWIN_HEAD_TILT_P_L]+(ram_data[DARWIN_HEAD_TILT_P_H]<<8);
-  head_tracking_tilt.ki=ram_data[DARWIN_HEAD_TILT_I_L]+(ram_data[DARWIN_HEAD_TILT_I_H]<<8);
-  head_tracking_tilt.kd=ram_data[DARWIN_HEAD_TILT_D_L]+(ram_data[DARWIN_HEAD_TILT_D_H]<<8);
-  head_tracking_tilt.prev_error=0;
-  head_tracking_tilt.integral_part=0;
-  head_tracking_tilt.integral_clamp=(ram_data[DARWIN_HEAD_TILT_I_CLAMP_L]+(ram_data[DARWIN_HEAD_TILT_I_CLAMP_H]<<8))<<9;
-  head_tracking_tilt.min_angle=manager_get_cw_angle_limit(L_TILT)<<9;
-  ram_data[DARWIN_HEAD_MIN_TILT_L]=manager_get_cw_angle_limit(L_TILT)%256;
-  ram_data[DARWIN_HEAD_MIN_TILT_H]=manager_get_cw_angle_limit(L_TILT)/256;
-  head_tracking_tilt.max_angle=manager_get_ccw_angle_limit(L_TILT)<<9;
-  ram_data[DARWIN_HEAD_MAX_TILT_L]=manager_get_ccw_angle_limit(L_TILT)%256;
-  ram_data[DARWIN_HEAD_MAX_TILT_H]=manager_get_ccw_angle_limit(L_TILT)/256;
-  head_tracking_tilt.target_angle=0;
-  head_tracking_period=(period_us<<16)/1000000;
-  head_tracking_period_us=period_us;
-  head_tracking_enabled=0x00;
-}
-
-void head_tracking_set_period(uint16_t period_us)
-{
-  head_tracking_period=(period_us<<16)/1000000;
-  head_tracking_period_us=period_us;
-}
-
-uint16_t head_tracking_get_period(void)
-{
-  return head_tracking_period_us;
-}
-
-void head_tracking_start(void)
-{
-  head_tracking_enabled=0x01;
-  ram_data[DARWIN_HEAD_CNTRL]|=HEAD_STATUS;
-}
-
-void head_tracking_stop(void)
-{
-  head_tracking_enabled=0x00;
-  ram_data[DARWIN_HEAD_CNTRL]&=(~HEAD_STATUS);
-}
-
-uint8_t head_is_tracking(void)
-{
-  return head_tracking_enabled;
-}
-
-void head_tracking_set_pan_range(int16_t max_angle,int16_t min_angle)
-{
-  head_tracking_pan.max_angle=max_angle<<9;
-  ram_data[DARWIN_HEAD_MAX_PAN_L]=max_angle%256;
-  ram_data[DARWIN_HEAD_MAX_PAN_H]=max_angle/256;
-  head_tracking_pan.min_angle=min_angle<<9;
-  ram_data[DARWIN_HEAD_MIN_PAN_L]=min_angle%256;
-  ram_data[DARWIN_HEAD_MIN_PAN_H]=min_angle/256;
-}
-
-void head_tracking_get_pan_range(int16_t *max_angle,int16_t *min_angle)
-{
-  *max_angle=head_tracking_pan.max_angle>>9;
-  *min_angle=head_tracking_pan.min_angle>>9;
-}
-
-void head_tracking_set_pan_pid(uint16_t kp,uint16_t ki,uint16_t kd, uint16_t i_clamp)
-{
-  head_tracking_pan.kp=kp;
-  ram_data[DARWIN_HEAD_PAN_P_L]=kp%256;
-  ram_data[DARWIN_HEAD_PAN_P_H]=kp/256;
-  head_tracking_pan.ki=ki;
-  ram_data[DARWIN_HEAD_PAN_I_L]=ki%256;
-  ram_data[DARWIN_HEAD_PAN_I_H]=ki/256;
-  head_tracking_pan.kd=kd;
-  ram_data[DARWIN_HEAD_PAN_D_L]=kd%256;
-  ram_data[DARWIN_HEAD_PAN_D_H]=kd/256;
-  head_tracking_pan.integral_clamp=i_clamp<<9;
-  ram_data[DARWIN_HEAD_PAN_I_CLAMP_L]=i_clamp%256;
-  ram_data[DARWIN_HEAD_PAN_I_CLAMP_H]=i_clamp/256;
-}
-
-void head_tracking_get_pan_pid(uint16_t *kp,uint16_t *ki,uint16_t *kd, uint16_t *i_clamp)
-{
-  *kp=head_tracking_pan.kp;
-  *ki=head_tracking_pan.ki;
-  *kd=head_tracking_pan.kd;
-  *i_clamp=head_tracking_pan.integral_clamp>>9;
-}
-
-void head_tracking_set_tilt_range(int16_t max_angle,int16_t min_angle)
-{
-  head_tracking_tilt.max_angle=max_angle<<9;
-  ram_data[DARWIN_HEAD_MAX_TILT_L]=max_angle%256;
-  ram_data[DARWIN_HEAD_MAX_TILT_H]=max_angle/256;
-  head_tracking_tilt.min_angle=min_angle<<9;
-  ram_data[DARWIN_HEAD_MIN_TILT_L]=min_angle%256;
-  ram_data[DARWIN_HEAD_MIN_TILT_H]=min_angle/256;
-}
-
-void head_tracking_get_tilt_range(int16_t *max_angle,int16_t *min_angle)
-{
-  *max_angle=head_tracking_tilt.max_angle>>9;
-  *min_angle=head_tracking_tilt.min_angle>>9;
-}
-
-void head_tracking_set_tilt_pid(uint16_t kp,uint16_t ki,uint16_t kd, uint16_t i_clamp)
-{
-  head_tracking_tilt.kp=kp;
-  ram_data[DARWIN_HEAD_TILT_P_L]=kp%256;
-  ram_data[DARWIN_HEAD_TILT_P_H]=kp/256;
-  head_tracking_tilt.ki=ki;
-  ram_data[DARWIN_HEAD_TILT_I_L]=ki%256;
-  ram_data[DARWIN_HEAD_TILT_I_H]=ki/256;
-  head_tracking_tilt.kd=kd;
-  ram_data[DARWIN_HEAD_TILT_D_L]=kd%256;
-  ram_data[DARWIN_HEAD_TILT_D_H]=kd/256;
-  head_tracking_tilt.integral_clamp=i_clamp<<9;
-  ram_data[DARWIN_HEAD_TILT_I_CLAMP_L]=i_clamp%256;
-  ram_data[DARWIN_HEAD_TILT_I_CLAMP_H]=i_clamp/256;
-}
-
-void head_tracking_get_tilt_pid(uint16_t *kp,uint16_t *ki,uint16_t *kd, uint16_t *i_clamp)
-{
-  *kp=head_tracking_tilt.kp;
-  *ki=head_tracking_tilt.ki;
-  *kd=head_tracking_tilt.kd;
-  *i_clamp=head_tracking_tilt.integral_clamp>>9;
-}
-
-void head_tracking_set_target_pan(int16_t target)
-{
-  head_tracking_pan.target_angle=target<<9;
-  ram_data[DARWIN_HEAD_PAN_TARGET_L]=target%256;
-  ram_data[DARWIN_HEAD_PAN_TARGET_H]=target/256;
-}
-
-void head_tracking_set_target_tilt(int16_t target)
-{
-  head_tracking_tilt.target_angle=target<<9;
-  ram_data[DARWIN_HEAD_TILT_TARGET_L]=target%256;
-  ram_data[DARWIN_HEAD_TILT_TARGET_H]=target/256;
-}
-
-// operation functions
-uint8_t head_tracking_in_range(unsigned short int address, unsigned short int length)
-{
-  if(ram_in_window(HEAD_BASE_ADDRESS,HEAD_MEM_LENGTH,address,length) ||
-     ram_in_window(HEAD_EEPROM_ADDRESS,HEAD_EEPROM_LENGTH,address,length))
-    return 0x01;
-  else
-    return 0x00;
-}
-
-void head_tracking_process_read_cmd(unsigned short int address,unsigned short int length,unsigned char *data)
-{
-
-}
-
-void head_tracking_process_write_cmd(unsigned short int address,unsigned short int length,unsigned char *data)
-{
-  uint16_t kp,kd,ki,i_clamp;
-  int16_t max,min,target;
-
-  // head tracking control
-  if(ram_in_range(DARWIN_HEAD_CNTRL,address,length))
-  {
-    if(data[DARWIN_HEAD_CNTRL-address]&HEAD_START)
-      head_tracking_start();
-    if(data[DARWIN_HEAD_CNTRL-address]&HEAD_STOP)
-      head_tracking_stop();
-  }
-  if(ram_in_window(DARWIN_HEAD_PAN_P_L,8,address,length))
-  {
-    head_tracking_get_pan_pid(&kp,&kd,&ki,&i_clamp);
-    if(ram_in_range(DARWIN_HEAD_PAN_P_L,address,length)) kp=(kp&0xFF00)|data[DARWIN_HEAD_PAN_P_L-address];
-    if(ram_in_range(DARWIN_HEAD_PAN_P_H,address,length)) kp=(kp&0x00FF)|(data[DARWIN_HEAD_PAN_P_H-address]<<8);
-    if(ram_in_range(DARWIN_HEAD_PAN_I_L,address,length)) ki=(ki&0xFF00)|data[DARWIN_HEAD_PAN_I_L-address];
-    if(ram_in_range(DARWIN_HEAD_PAN_I_H,address,length)) ki=(ki&0x00FF)|(data[DARWIN_HEAD_PAN_I_H-address]<<8);
-    if(ram_in_range(DARWIN_HEAD_PAN_D_L,address,length)) kd=(kd&0xFF00)|data[DARWIN_HEAD_PAN_D_L-address];
-    if(ram_in_range(DARWIN_HEAD_PAN_D_H,address,length)) kd=(kd&0x00FF)|(data[DARWIN_HEAD_PAN_D_H-address]<<8);
-    if(ram_in_range(DARWIN_HEAD_PAN_I_CLAMP_L,address,length)) i_clamp=(i_clamp&0xFF00)|data[DARWIN_HEAD_PAN_I_CLAMP_L-address];
-    if(ram_in_range(DARWIN_HEAD_PAN_I_CLAMP_H,address,length)) i_clamp=(i_clamp&0x00FF)|(data[DARWIN_HEAD_PAN_I_CLAMP_H-address]<<8);
-    head_tracking_set_pan_pid(kp,kd,ki,i_clamp);
-  }
-  if(ram_in_window(DARWIN_HEAD_TILT_P_L,8,address,length))
-  {
-    head_tracking_get_tilt_pid(&kp,&kd,&ki,&i_clamp);
-    if(ram_in_range(DARWIN_HEAD_TILT_P_L,address,length)) kp=(kp&0xFF00)|data[DARWIN_HEAD_TILT_P_L-address];
-    if(ram_in_range(DARWIN_HEAD_TILT_P_H,address,length)) kp=(kp&0x00FF)|(data[DARWIN_HEAD_TILT_P_H-address]<<8);
-    if(ram_in_range(DARWIN_HEAD_TILT_I_L,address,length)) ki=(ki&0xFF00)|data[DARWIN_HEAD_TILT_I_L-address];
-    if(ram_in_range(DARWIN_HEAD_TILT_I_H,address,length)) ki=(ki&0x00FF)|(data[DARWIN_HEAD_TILT_I_H-address]<<8);
-    if(ram_in_range(DARWIN_HEAD_TILT_D_L,address,length)) kd=(kd&0xFF00)|data[DARWIN_HEAD_TILT_D_L-address];
-    if(ram_in_range(DARWIN_HEAD_TILT_D_H,address,length)) kd=(kd&0x00FF)|(data[DARWIN_HEAD_TILT_D_H-address]<<8);
-    if(ram_in_range(DARWIN_HEAD_TILT_I_CLAMP_L,address,length)) i_clamp=(i_clamp&0xFF00)|data[DARWIN_HEAD_TILT_I_CLAMP_L-address];
-    if(ram_in_range(DARWIN_HEAD_TILT_I_CLAMP_H,address,length)) i_clamp=(i_clamp&0x00FF)|(data[DARWIN_HEAD_TILT_I_CLAMP_H-address]<<8);
-    head_tracking_set_tilt_pid(kp,kd,ki,i_clamp);
-  }
-  if(ram_in_window(DARWIN_HEAD_MAX_PAN_L,4,address,length))
-  {
-    head_tracking_get_pan_range(&max,&min);
-    if(ram_in_range(DARWIN_HEAD_MAX_PAN_L,address,length)) max=(max&0xFF00)|data[DARWIN_HEAD_MAX_PAN_L-address];
-    if(ram_in_range(DARWIN_HEAD_MAX_PAN_H,address,length)) max=(max&0x00FF)|(data[DARWIN_HEAD_MAX_PAN_H-address]<<8);
-    if(ram_in_range(DARWIN_HEAD_MIN_PAN_L,address,length)) min=(min&0xFF00)|data[DARWIN_HEAD_MIN_PAN_L-address];
-    if(ram_in_range(DARWIN_HEAD_MIN_PAN_H,address,length)) min=(min&0x00FF)|(data[DARWIN_HEAD_MIN_PAN_H-address]<<8);
-    head_tracking_set_pan_range(max,min);
-  }
-  if(ram_in_window(DARWIN_HEAD_MAX_TILT_L,4,address,length))
-  {
-    head_tracking_get_tilt_range(&max,&min);
-    if(ram_in_range(DARWIN_HEAD_MAX_TILT_L,address,length)) max=(max&0xFF00)|data[DARWIN_HEAD_MAX_TILT_L-address];
-    if(ram_in_range(DARWIN_HEAD_MAX_TILT_H,address,length)) max=(max&0x00FF)|(data[DARWIN_HEAD_MAX_TILT_H-address]<<8);
-    if(ram_in_range(DARWIN_HEAD_MIN_TILT_L,address,length)) min=(min&0xFF00)|data[DARWIN_HEAD_MIN_TILT_L-address];
-    if(ram_in_range(DARWIN_HEAD_MIN_TILT_H,address,length)) min=(min&0x00FF)|(data[DARWIN_HEAD_MIN_TILT_H-address]<<8);
-    head_tracking_set_tilt_range(max,min);
-  }
-  if(ram_in_window(DARWIN_HEAD_PAN_TARGET_L,2,address,length))
-  {
-    target=(head_tracking_pan.target_angle>>9);
-    if(ram_in_range(DARWIN_HEAD_PAN_TARGET_L,address,length))
-    { 
-      target=(target&0xFF00)|data[DARWIN_HEAD_PAN_TARGET_L-address];
-      ram_data[DARWIN_HEAD_PAN_TARGET_L]=data[DARWIN_HEAD_PAN_TARGET_L-address];
-    }
-    if(ram_in_range(DARWIN_HEAD_PAN_TARGET_H,address,length))
-    {
-      target=(target&0x00FF)|(data[DARWIN_HEAD_PAN_TARGET_H-address]<<8);
-      ram_data[DARWIN_HEAD_PAN_TARGET_H]=data[DARWIN_HEAD_PAN_TARGET_H-address];
-    }
-    head_tracking_pan.target_angle=(target<<9);
-  }
-  if(ram_in_window(DARWIN_HEAD_TILT_TARGET_L,2,address,length))
-  {
-    target=(head_tracking_tilt.target_angle>>9);
-    if(ram_in_range(DARWIN_HEAD_TILT_TARGET_L,address,length))
-    {
-      target=(target&0xFF00)|data[DARWIN_HEAD_TILT_TARGET_L-address];
-      ram_data[DARWIN_HEAD_TILT_TARGET_L]=data[DARWIN_HEAD_TILT_TARGET_L-address];
-    }
-    if(ram_in_range(DARWIN_HEAD_TILT_TARGET_H,address,length))
-    {
-      target=(target&0x00FF)|(data[DARWIN_HEAD_TILT_TARGET_H-address]<<8);
-      ram_data[DARWIN_HEAD_TILT_TARGET_H]=data[DARWIN_HEAD_TILT_TARGET_H-address];
-    }
-    head_tracking_tilt.target_angle=(target<<9);
-  }
-}
-
-// motion manager process function
-void head_tracking_process(void)
-{
-  int64_t pan_error, tilt_error;
-  int64_t derivative_pan=0, derivative_tilt=0;
-
-  if(head_tracking_enabled)
-  {
-    ram_data[DARWIN_HEAD_CNTRL]|=HEAD_STATUS;
-    if(manager_get_module(L_PAN)==MM_HEAD)
-    {
-      pan_error = head_tracking_pan.target_angle-manager_current_angles[L_PAN];
-      head_tracking_pan.integral_part+=(pan_error*head_tracking_period)>>16;
-      if(head_tracking_pan.integral_part>head_tracking_pan.integral_clamp)
-        head_tracking_pan.integral_part=head_tracking_pan.integral_clamp;
-      else if(head_tracking_pan.integral_part<-head_tracking_pan.integral_clamp)
-        head_tracking_pan.integral_part=-head_tracking_pan.integral_clamp;
-      derivative_pan = ((pan_error - head_tracking_pan.prev_error)<<16)/head_tracking_period;
-      manager_current_angles[L_PAN]+=((head_tracking_pan.kp*pan_error)>>16);
-      manager_current_angles[L_PAN]+=((head_tracking_pan.ki*head_tracking_pan.integral_part)>>16);
-      manager_current_angles[L_PAN]+=((head_tracking_pan.kd*derivative_pan)>>16);
-      if(manager_current_angles[L_PAN]>head_tracking_pan.max_angle)
-        manager_current_angles[L_PAN]=head_tracking_pan.max_angle;
-      else if(manager_current_angles[L_PAN]<head_tracking_pan.min_angle)
-        manager_current_angles[L_PAN]=head_tracking_pan.min_angle;
-      head_tracking_pan.prev_error = pan_error;
-    }
-    if(manager_get_module(L_TILT)==MM_HEAD)
-    { 
-      tilt_error = head_tracking_tilt.target_angle-manager_current_angles[L_TILT];
-      head_tracking_tilt.integral_part+=(tilt_error*head_tracking_period)>>16;
-      if(head_tracking_tilt.integral_part>head_tracking_tilt.integral_clamp)
-        head_tracking_tilt.integral_part=head_tracking_tilt.integral_clamp;
-      else if(head_tracking_tilt.integral_part<-head_tracking_tilt.integral_clamp)
-        head_tracking_tilt.integral_part=-head_tracking_tilt.integral_clamp;
-      derivative_tilt = ((tilt_error - head_tracking_tilt.prev_error)<<16)/head_tracking_period;
-      manager_current_angles[L_TILT]+=((head_tracking_tilt.kp*tilt_error)>>16);
-      manager_current_angles[L_TILT]+=((head_tracking_tilt.ki*head_tracking_tilt.integral_part)>>16);
-      manager_current_angles[L_TILT]+=((head_tracking_tilt.kd*derivative_tilt)>>16);
-      if(manager_current_angles[L_TILT]>head_tracking_tilt.max_angle)
-        manager_current_angles[L_TILT]=head_tracking_tilt.max_angle;
-      else if(manager_current_angles[L_TILT]<head_tracking_tilt.min_angle)
-        manager_current_angles[L_TILT]=head_tracking_tilt.min_angle;
-      head_tracking_tilt.prev_error = tilt_error;
-    }
-  }
-  else
-    ram_data[DARWIN_HEAD_CNTRL]&=(~HEAD_STATUS);
-}
-