diff --git a/include/bioloid_registers.h b/include/bioloid_registers.h
index 3c550ef0ace010bcd7720f7afb6ae498c0d1a2d9..25129989e673341bed07e64f46a2dedf63e94680 100644
--- a/include/bioloid_registers.h
+++ b/include/bioloid_registers.h
@@ -5,238 +5,251 @@
 extern "C" {
 #endif
 
-#define DEVICE_MODEL_OFFSET      ((unsigned short int)0x0000)
-#define FIRMWARE_VERSION_OFFSET  ((unsigned short int)0x0002)
-#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 GYRO_FB_ADC_CH_OFFSET    ((unsigned short int)0x0008)
-#define GYRO_LR_ADC_CH_OFFSET    ((unsigned short int)0x0009)
-#define RETURN_LEVEL_OFFSET      ((unsigned short int)0x0010)
+#define DEVICE_MODEL_OFFSET             ((unsigned short int)0x0000)
+#define FIRMWARE_VERSION_OFFSET         ((unsigned short int)0x0002)
+#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 MM_BAL_KNEE_GAIN_OFFSET         ((unsigned short int)0x0008)
+#define MM_BAL_ANKLE_ROLL_GAIN_OFFSET   ((unsigned short int)0x000A)
+#define MM_BAL_ANKLE_PITCH_GAIN_OFFSET  ((unsigned short int)0x000C)
+#define MM_BAL_HIP_ROLL_GAIN_OFFSET     ((unsigned short int)0x000E)
+#define RETURN_LEVEL_OFFSET             ((unsigned short int)0x0010)
+#define GYRO_FB_ADC_CH_OFFSET           ((unsigned short int)0x0011)
+#define GYRO_LR_ADC_CH_OFFSET           ((unsigned short int)0x0012)
 
-#define LAST_EEPROM_OFFSET       ((unsigned short int)0x0020)
+#define LAST_EEPROM_OFFSET              ((unsigned short int)0x0020)
 
 typedef enum {
-  BIOLOID_MODEL_NUMBER_L          = DEVICE_MODEL_OFFSET,
-  BIOLOID_MODEL_NUMBER_H          = DEVICE_MODEL_OFFSET+1,
-  BIOLOID_VERSION                 = FIRMWARE_VERSION_OFFSET,
-  BIOLOID_ID                      = DEVICE_ID_OFFSET,
-  BIOLOID_BAUD_RATE               = BAUDRATE_OFFSET,
-  BIOLOID_RETURN_DELAY_TIME       = RETURN_DELAY_OFFSET,
-  BIOLOID_MM_PERIOD_L             = MM_PERIOD_OFFSET,
-  BIOLOID_MM_PERIOD_H             = MM_PERIOD_OFFSET+1,
-  BIOLIOD_GYRO_FB_ADC_CH          = GYRO_FB_ADC_CH_OFFSET,
-  BIOLIOD_GYRO_LR_ADC_CH          = GYRO_LR_ADC_CH_OFFSET,
-  BIOLOID_RETURN_LEVEL            = RETURN_LEVEL_OFFSET,
-  BIOLOID_USER1_LED_CNTRL         = 0x20, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2  | bit 1 |      bit 0
-                                          //       |       |       |       | blink | toggle | value | internally used
-  BIOLOID_USER1_LED_PERIOD_L      = 0x21,
-  BIOLOID_USER1_LED_PERIOD_H      = 0x22,     
-  BIOLOID_USER2_LED_CNTRL         = 0x23, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2  | bit 1 |      bit 0
-                                          //       |       |       |       | blink | toggle | value | internally used
-  BIOLOID_USER2_LED_PERIOD_L      = 0x24,
-  BIOLOID_USER2_LED_PERIOD_H      = 0x25,     
-  BIOLOID_RXD_LED_CNTRL           = 0x26, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2  | bit 1 |      bit 0
-                                          //       |       |       |       | blink | toggle | value | internally used
-  BIOLOID_RXD_LED_PERIOD_L        = 0x27,
-  BIOLOID_RXD_LED_PERIOD_H        = 0x28,     
-  BIOLOID_TXD_LED_CNTRL           = 0x29, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2  | bit 1 |      bit 0
-                                          //       |       |       |       | blink | toggle | value | internally used
-  BIOLOID_TXD_LED_PERIOD_L        = 0x2A,
-  BIOLOID_TXD_LED_PERIOD_H        = 0x2B,     
-  BIOLOID_USER_PB_CNTRL           = 0x2C, // bit 7 | bit 6 | bit 5 | bit 4 |     bit 3      |       bit 2      | bit 1 |      bit 0
-                                          //       |       |       |       | interrupt flag | enable interrupt | value | internally used
-  BIOLOID_RESET_PB_CNTRL          = 0x2D, // bit 7 | bit 6 | bit 5 | bit 4 |     bit 3      |       bit 2      | bit 1 |      bit 0
-                                          //       |       |       |       | interrupt flag | enable interrupt | value | internally used
-  BIOLOID_START_PB_CNTRL          = 0x2E, // bit 7 | bit 6 | bit 5 | bit 4 |     bit 3      |       bit 2      | bit 1 |      bit 0
-                                          //       |       |       |       | interrupt flag | enable interrupt | value | internally used
-  BIOLOID_MODE_PB_CNTRL           = 0x2F, // bit 7 | bit 6 | bit 5 | bit 4 |     bit 3      |       bit 2      | bit 1 |      bit 0
-                                          //       |       |       |       | interrupt flag | enable interrupt | value | internally used
-  BIOLOID_ADC_CNTRL               = 0x30, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0
-                                          //       |       |       |       |       |       |       | Enable
-  BIOLOID_ADC_PERIOD              = 0x31,
-  BIOLOID_ADC_CH1_L               = 0x32,
-  BIOLOID_ADC_CH1_H               = 0x33,
-  BIOLOID_ADC_CH2_L               = 0x34,
-  BIOLOID_ADC_CH2_H               = 0x35,
-  BIOLOID_ADC_CH3_L               = 0x36,
-  BIOLOID_ADC_CH3_H               = 0x37,
-  BIOLOID_ADC_CH4_L               = 0x38,
-  BIOLOID_ADC_CH4_H               = 0x39,
-  BIOLOID_ADC_TEMP_L              = 0x3A,
-  BIOLOID_ADC_TEMP_H              = 0x3B,
-  BIOLOID_ADC_CH6_L               = 0x3C,
-  BIOLOID_ADC_CH6_H               = 0x3D,
-  BIOLOID_ADC_VREF_L              = 0x3E,
-  BIOLOID_ADC_VREF_H              = 0x3F,
-  BIOLOID_ADC_CH8_L               = 0x40,
-  BIOLOID_ADC_CH8_H               = 0x41,
-  BIOLOID_ZIGBEE_CNTRL            = 0x42, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 |  bit 1  |    bit 0
-                                          //       |       |       |       |       |       | Enable  | Enable power
-  BIOLOID_ZIGBEE_BAUDRATE         = 0x43,
-  BIOLOID_ZIGBEE_OWN_ID_L         = 0x44,
-  BIOLOID_ZIGBEE_OWN_ID_H         = 0x45,
-  BIOLOID_ZIGBEE_REM_ID_L         = 0x46,
-  BIOLOID_ZIGBEE_REM_ID_H         = 0x47,
-  BIOLOID_MM_NUM_SERVOS           = 0x48,
-  BIOLOID_MM_CNTRL                = 0x49, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 |     bit 2    |      bit 1      |    bit 0
-                                          //       |       |       |       |       | Enable power | Enable balance  | Enable manager
-  BIOLOID_MM_MODULE_EN0           = 0x4A, //      bit 7      | bit 6 | bit 5 | bit 4 |      bit 3      | bit 2 | bit 1 | bit 0i
-                                          // Enable servo 0  |   assigned module     | Enable servo 1  |   assigned module
-                                          //                 |     000 -> none       |
-                                          //                 |     001 -> action     |
-                                          //                 |     010 -> walk       |
-                                          //                 |     011 -> joints     |
-  BIOLOID_MM_MODULE_EN1           = 0x4B, //      bit 7      | bit 6 | bit 5 | bit 4 |      bit 3      | bit 2 | bit 1 | bit 0
-                                          // Enable servo 2  |   assigned module     | Enable servo 3  |   assigned module
-  BIOLOID_MM_MODULE_EN2           = 0x4C, //      bit 7      | bit 6 | bit 5 | bit 4 |      bit 3      | bit 2 | bit 1 | bit 0
-                                          // Enable servo 4  |   assigned module     | Enable servo 5  |   assigned module
-  BIOLOID_MM_MODULE_EN3           = 0x4D, //      bit 7      | bit 6 | bit 5 | bit 4 |      bit 3      | bit 2 | bit 1 | bit 0
-                                          // Enable servo 6  |   assigned module     | Enable servo 7  |   assigned module
-  BIOLOID_MM_MODULE_EN4           = 0x4E, //      bit 7      | bit 6 | bit 5 | bit 4 |      bit 3      | bit 2 | bit 1 | bit 0
-                                          // Enable servo 8  |   assigned module     | Enable servo 9  |   assigned module
-  BIOLOID_MM_MODULE_EN5           = 0x4F, //      bit 7      | bit 6 | bit 5 | bit 4 |      bit 3      | bit 2 | bit 1 | bit 0
-                                          // Enable servo 10 |   assigned module     | Enable servo 11 |   assigned module
-  BIOLOID_MM_MODULE_EN6           = 0x50, //      bit 7      | bit 6 | bit 5 | bit 4 |      bit 3      | bit 2 | bit 1 | bit 0
-                                          // Enable servo 12 |   assigned module     | Enable servo 13 |   assigned module
-  BIOLOID_MM_MODULE_EN7           = 0x51, //      bit 7      | bit 6 | bit 5 | bit 4 |      bit 3      | bit 2 | bit 1 | bit 0
-                                          // Enable servo 14 |   assigned module     | Enable servo 15 |   assigned module
-  BIOLOID_MM_MODULE_EN8           = 0x52, //      bit 7      | bit 6 | bit 5 | bit 4 |      bit 3      | bit 2 | bit 1 | bit 0
-                                          // Enable servo 16 |   assigned module     | Enable servo 17 |   assigned module
-  BIOLOID_MM_MODULE_EN9           = 0x53, //      bit 7      | bit 6 | bit 5 | bit 4 |      bit 3      | bit 2 | bit 1 | bit 0
-                                          // Enable servo 18 |   assigned module     | Enable servo 19 |   assigned module
-  BIOLOID_MM_MODULE_EN10          = 0x54, //      bit 7      | bit 6 | bit 5 | bit 4 |      bit 3      | bit 2 | bit 1 | bit 0
-                                          // Enable servo 20 |   assigned module     | Enable servo 21 |   assigned module
-  BIOLOID_MM_MODULE_EN11          = 0x55, //      bit 7      | bit 6 | bit 5 | bit 4 |      bit 3      | bit 2 | bit 1 | bit 0
-                                          // Enable servo 22 |   assigned module     | Enable servo 23 |   assigned module
-  BIOLOID_MM_MODULE_EN12          = 0x56, //      bit 7      | bit 6 | bit 5 | bit 4 |      bit 3      | bit 2 | bit 1 | bit 0
-                                          // Enable servo 24 |   assigned module     | Enable servo 25 |   assigned module
-  BIOLOID_MM_MODULE_EN13          = 0x57, //      bit 7      | bit 6 | bit 5 | bit 4 |      bit 3      | bit 2 | bit 1 | bit 0
-                                          // Enable servo 26 |   assigned module     | Enable servo 27 |   assigned module
-  BIOLOID_MM_MODULE_EN14          = 0x58, //      bit 7      | bit 6 | bit 5 | bit 4 |      bit 3      | bit 2 | bit 1 | bit 0
-                                          // Enable servo 28 |   assigned module     | Enable servo 29 |   assigned module
-  BIOLOID_MM_MODULE_EN15          = 0x59, //      bit 7      | bit 6 | bit 5 | bit 4 |      bit 3      | bit 2 | bit 1 | bit 0
-                                          // Enable servo 30 |   assigned module     | Enable servo 31 |   assigned module
-  BIOLOID_MM_SERVO0_CUR_POS_L     = 0x5A, // angle in fixed point format 9|7
-  BIOLOID_MM_SERVO0_CUR_POS_H     = 0x5B,
-  BIOLOID_MM_SERVO1_CUR_POS_L     = 0x5C, // angle in fixed point format 9|7
-  BIOLOID_MM_SERVO1_CUR_POS_H     = 0x5D,
-  BIOLOID_MM_SERVO2_CUR_POS_L     = 0x5E, // angle in fixed point format 9|7
-  BIOLOID_MM_SERVO2_CUR_POS_H     = 0x5F,
-  BIOLOID_MM_SERVO3_CUR_POS_L     = 0x60, // angle in fixed point format 9|7
-  BIOLOID_MM_SERVO3_CUR_POS_H     = 0x61,
-  BIOLOID_MM_SERVO4_CUR_POS_L     = 0x62, // angle in fixed point format 9|7
-  BIOLOID_MM_SERVO4_CUR_POS_H     = 0x63,
-  BIOLOID_MM_SERVO5_CUR_POS_L     = 0x64, // angle in fixed point format 9|7
-  BIOLOID_MM_SERVO5_CUR_POS_H     = 0x65,
-  BIOLOID_MM_SERVO6_CUR_POS_L     = 0x66, // angle in fixed point format 9|7
-  BIOLOID_MM_SERVO6_CUR_POS_H     = 0x67,
-  BIOLOID_MM_SERVO7_CUR_POS_L     = 0x68, // angle in fixed point format 9|7
-  BIOLOID_MM_SERVO7_CUR_POS_H     = 0x69,
-  BIOLOID_MM_SERVO8_CUR_POS_L     = 0x6A, // angle in fixed point format 9|7
-  BIOLOID_MM_SERVO8_CUR_POS_H     = 0x6B,
-  BIOLOID_MM_SERVO9_CUR_POS_L     = 0x6C, // angle in fixed point format 9|7
-  BIOLOID_MM_SERVO9_CUR_POS_H     = 0x6D,
-  BIOLOID_MM_SERVO10_CUR_POS_L    = 0x6E, // angle in fixed point format 9|7
-  BIOLOID_MM_SERVO10_CUR_POS_H    = 0x6F,
-  BIOLOID_MM_SERVO11_CUR_POS_L    = 0x70, // angle in fixed point format 9|7
-  BIOLOID_MM_SERVO11_CUR_POS_H    = 0x71,
-  BIOLOID_MM_SERVO12_CUR_POS_L    = 0x72, // angle in fixed point format 9|7
-  BIOLOID_MM_SERVO12_CUR_POS_H    = 0x73,
-  BIOLOID_MM_SERVO13_CUR_POS_L    = 0x74, // angle in fixed point format 9|7
-  BIOLOID_MM_SERVO13_CUR_POS_H    = 0x75,
-  BIOLOID_MM_SERVO14_CUR_POS_L    = 0x76, // angle in fixed point format 9|7
-  BIOLOID_MM_SERVO14_CUR_POS_H    = 0x77,
-  BIOLOID_MM_SERVO15_CUR_POS_L    = 0x78, // angle in fixed point format 9|7
-  BIOLOID_MM_SERVO15_CUR_POS_H    = 0x79,
-  BIOLOID_MM_SERVO16_CUR_POS_L    = 0x7A, // angle in fixed point format 9|7
-  BIOLOID_MM_SERVO16_CUR_POS_H    = 0x7B,
-  BIOLOID_MM_SERVO17_CUR_POS_L    = 0x7C, // angle in fixed point format 9|7
-  BIOLOID_MM_SERVO17_CUR_POS_H    = 0x7D,
-  BIOLOID_MM_SERVO18_CUR_POS_L    = 0x7E, // angle in fixed point format 9|7
-  BIOLOID_MM_SERVO18_CUR_POS_H    = 0x7F,
-  BIOLOID_MM_SERVO19_CUR_POS_L    = 0x80, // angle in fixed point format 9|7
-  BIOLOID_MM_SERVO19_CUR_POS_H    = 0x81,
-  BIOLOID_MM_SERVO20_CUR_POS_L    = 0x82, // angle in fixed point format 9|7
-  BIOLOID_MM_SERVO20_CUR_POS_H    = 0x83,
-  BIOLOID_MM_SERVO21_CUR_POS_L    = 0x84, // angle in fixed point format 9|7
-  BIOLOID_MM_SERVO21_CUR_POS_H    = 0x85,
-  BIOLOID_MM_SERVO22_CUR_POS_L    = 0x86, // angle in fixed point format 9|7
-  BIOLOID_MM_SERVO22_CUR_POS_H    = 0x87,
-  BIOLOID_MM_SERVO23_CUR_POS_L    = 0x88, // angle in fixed point format 9|7
-  BIOLOID_MM_SERVO23_CUR_POS_H    = 0x89,
-  BIOLOID_MM_SERVO24_CUR_POS_L    = 0x8A, // angle in fixed point format 9|7
-  BIOLOID_MM_SERVO24_CUR_POS_H    = 0x8B,
-  BIOLOID_MM_SERVO25_CUR_POS_L    = 0x8C, // angle in fixed point format 9|7
-  BIOLOID_MM_SERVO25_CUR_POS_H    = 0x8D,
-  BIOLOID_MM_SERVO26_CUR_POS_L    = 0x8E, // angle in fixed point format 9|7
-  BIOLOID_MM_SERVO26_CUR_POS_H    = 0x8F,
-  BIOLOID_MM_SERVO27_CUR_POS_L    = 0x90, // angle in fixed point format 9|7
-  BIOLOID_MM_SERVO27_CUR_POS_H    = 0x91,
-  BIOLOID_MM_SERVO28_CUR_POS_L    = 0x92, // angle in fixed point format 9|7
-  BIOLOID_MM_SERVO28_CUR_POS_H    = 0x93,
-  BIOLOID_MM_SERVO29_CUR_POS_L    = 0x94, // angle in fixed point format 9|7
-  BIOLOID_MM_SERVO29_CUR_POS_H    = 0x95,
-  BIOLOID_MM_SERVO30_CUR_POS_L    = 0x96, // angle in fixed point format 9|7
-  BIOLOID_MM_SERVO30_CUR_POS_H    = 0x97,
-  BIOLOID_MM_SERVO31_CUR_POS_L    = 0x98, // angle in fixed point format 9|7
-  BIOLOID_MM_SERVO31_CUR_POS_H    = 0x99,
-  BIOLOID_ACTION_PAGE             = 0x9A,
-  BIOLOID_ACTION_CNTRL            = 0x9B, // bit 7 | bit 6 | bit 5 |     bit 4    |     bit 3      |       bit 2      |   bit 1   |   bit 0
-                                          //       |       |       | page running | interrupt flag | enable interrupt | stop page | start page
-  BIOLOID_GYRO_CNTRL              = 0x9C, // bit 7 | bit 6 | bit 5 | bit 4 |     bit 3       |       bit 2     |         bit 1        |   bit 0
-                                          //       |       |       |       | enable fall int | enable fall det | enable calibrate int | calibrate
-  BIOLOID_GYRO_STATUS             = 0x9D, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0
-                                          // 
-  BIOLOID_GYRO_FWD_FALL_THD       = 0x9E,
-  BIOLOID_GYRO_BWD_FALL_THD       = 0x9F,
-  BIOLOID_GYRO_LEFT_FALL_THD      = 0xA0,
-  BOILOID_GYRO_RIGHT_FALL_THD     = 0xA1
+  BIOLOID_MODEL_NUMBER_L            = DEVICE_MODEL_OFFSET,
+  BIOLOID_MODEL_NUMBER_H            = DEVICE_MODEL_OFFSET+1,
+  BIOLOID_VERSION                   = FIRMWARE_VERSION_OFFSET,
+  BIOLOID_ID                        = DEVICE_ID_OFFSET,
+  BIOLOID_BAUD_RATE                 = BAUDRATE_OFFSET,
+  BIOLOID_RETURN_DELAY_TIME         = RETURN_DELAY_OFFSET,
+  BIOLOID_MM_PERIOD_L               = MM_PERIOD_OFFSET,
+  BIOLOID_MM_PERIOD_H               = MM_PERIOD_OFFSET+1,
+  BIOLOID_MM_BAL_KNEE_GAIN_L        = MM_BAL_KNEE_GAIN_OFFSET,// fixed point format 0|16
+  BIOLOID_MM_BAL_KNEE_GAIN_H        = MM_BAL_KNEE_GAIN_OFFSET+1,
+  BIOLOID_MM_BAL_ANKLE_ROLL_GAIN_L  = MM_BAL_ANKLE_ROLL_GAIN_OFFSET,// fixed point format 0|16
+  BIOLOID_MM_BAL_ANKLE_ROLL_GAIN_H  = MM_BAL_ANKLE_ROLL_GAIN_OFFSET+1,
+  BIOLOID_MM_BAL_ANKLE_PITCH_GAIN_L = MM_BAL_ANKLE_PITCH_GAIN_OFFSET,// fixed point format 0|16
+  BIOLOID_MM_BAL_ANKLE_PITCH_GAIN_H = MM_BAL_ANKLE_PITCH_GAIN_OFFSET+1,
+  BIOLOID_MM_BAL_HIP_ROLL_GAIN_L    = MM_BAL_HIP_ROLL_GAIN_OFFSET,// fixed point format 0|16
+  BIOLOID_MM_BAL_HIP_ROLL_GAIN_H    = MM_BAL_HIP_ROLL_GAIN_OFFSET+1,
+  BIOLOID_RETURN_LEVEL              = RETURN_LEVEL_OFFSET,
+  BIOLIOD_GYRO_FB_ADC_CH            = GYRO_FB_ADC_CH_OFFSET,
+  BIOLIOD_GYRO_LR_ADC_CH            = GYRO_LR_ADC_CH_OFFSET,
+  BIOLOID_USER1_LED_CNTRL           = 0x20, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2  | bit 1 |      bit 0
+                                            //       |       |       |       | blink | toggle | value | internally used
+  BIOLOID_USER1_LED_PERIOD_L        = 0x21,
+  BIOLOID_USER1_LED_PERIOD_H        = 0x22,     
+  BIOLOID_USER2_LED_CNTRL           = 0x23, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2  | bit 1 |      bit 0
+                                            //       |       |       |       | blink | toggle | value | internally used
+  BIOLOID_USER2_LED_PERIOD_L        = 0x24,
+  BIOLOID_USER2_LED_PERIOD_H        = 0x25,     
+  BIOLOID_RXD_LED_CNTRL             = 0x26, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2  | bit 1 |      bit 0
+                                            //       |       |       |       | blink | toggle | value | internally used
+  BIOLOID_RXD_LED_PERIOD_L          = 0x27,
+  BIOLOID_RXD_LED_PERIOD_H          = 0x28,     
+  BIOLOID_TXD_LED_CNTRL             = 0x29, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2  | bit 1 |      bit 0
+                                            //       |       |       |       | blink | toggle | value | internally used
+  BIOLOID_TXD_LED_PERIOD_L          = 0x2A,
+  BIOLOID_TXD_LED_PERIOD_H          = 0x2B,     
+  BIOLOID_USER_PB_CNTRL             = 0x2C, // bit 7 | bit 6 | bit 5 | bit 4 |     bit 3      |       bit 2      | bit 1 |      bit 0
+                                            //       |       |       |       | interrupt flag | enable interrupt | value | internally used
+  BIOLOID_RESET_PB_CNTRL            = 0x2D, // bit 7 | bit 6 | bit 5 | bit 4 |     bit 3      |       bit 2      | bit 1 |      bit 0
+                                            //       |       |       |       | interrupt flag | enable interrupt | value | internally used
+  BIOLOID_START_PB_CNTRL            = 0x2E, // bit 7 | bit 6 | bit 5 | bit 4 |     bit 3      |       bit 2      | bit 1 |      bit 0
+                                            //       |       |       |       | interrupt flag | enable interrupt | value | internally used
+  BIOLOID_MODE_PB_CNTRL             = 0x2F, // bit 7 | bit 6 | bit 5 | bit 4 |     bit 3      |       bit 2      | bit 1 |      bit 0
+                                            //       |       |       |       | interrupt flag | enable interrupt | value | internally used
+  BIOLOID_ADC_CNTRL                 = 0x30, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0
+                                            //       |       |       |       |       |       |       | Enable
+  BIOLOID_ADC_PERIOD                = 0x31,
+  BIOLOID_ADC_CH1_L                 = 0x32,
+  BIOLOID_ADC_CH1_H                 = 0x33,
+  BIOLOID_ADC_CH2_L                 = 0x34,
+  BIOLOID_ADC_CH2_H                 = 0x35,
+  BIOLOID_ADC_CH3_L                 = 0x36,
+  BIOLOID_ADC_CH3_H                 = 0x37,
+  BIOLOID_ADC_CH4_L                 = 0x38,
+  BIOLOID_ADC_CH4_H                 = 0x39,
+  BIOLOID_ADC_TEMP_L                = 0x3A,
+  BIOLOID_ADC_TEMP_H                = 0x3B,
+  BIOLOID_ADC_CH6_L                 = 0x3C,
+  BIOLOID_ADC_CH6_H                 = 0x3D,
+  BIOLOID_ADC_VREF_L                = 0x3E,
+  BIOLOID_ADC_VREF_H                = 0x3F,
+  BIOLOID_ADC_CH8_L                 = 0x40,
+  BIOLOID_ADC_CH8_H                 = 0x41,
+  BIOLOID_ZIGBEE_CNTRL              = 0x42, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 |  bit 1  |    bit 0
+                                            //       |       |       |       |       |       | Enable  | Enable power
+  BIOLOID_ZIGBEE_BAUDRATE           = 0x43,
+  BIOLOID_ZIGBEE_OWN_ID_L           = 0x44,
+  BIOLOID_ZIGBEE_OWN_ID_H           = 0x45,
+  BIOLOID_ZIGBEE_REM_ID_L           = 0x46,
+  BIOLOID_ZIGBEE_REM_ID_H           = 0x47,
+  BIOLOID_MM_NUM_SERVOS             = 0x48,
+  BIOLOID_MM_CNTRL                  = 0x49, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 |     bit 2    |      bit 1      |    bit 0
+                                            //       |       |       |       |       | Enable power | Enable balance  | Enable manager
+  BIOLOID_MM_MODULE_EN0             = 0x4A, //      bit 7      | bit 6 | bit 5 | bit 4 |      bit 3      | bit 2 | bit 1 | bit 0i
+                                            // Enable servo 0  |   assigned module     | Enable servo 1  |   assigned module
+                                            //                 |     000 -> none       |
+                                            //                 |     001 -> action     |
+                                            //                 |     010 -> walk       |
+                                            //                 |     011 -> joints     |
+  BIOLOID_MM_MODULE_EN1             = 0x4B, //      bit 7      | bit 6 | bit 5 | bit 4 |      bit 3      | bit 2 | bit 1 | bit 0
+                                            // Enable servo 2  |   assigned module     | Enable servo 3  |   assigned module
+  BIOLOID_MM_MODULE_EN2             = 0x4C, //      bit 7      | bit 6 | bit 5 | bit 4 |      bit 3      | bit 2 | bit 1 | bit 0
+                                            // Enable servo 4  |   assigned module     | Enable servo 5  |   assigned module
+  BIOLOID_MM_MODULE_EN3             = 0x4D, //      bit 7      | bit 6 | bit 5 | bit 4 |      bit 3      | bit 2 | bit 1 | bit 0
+                                            // Enable servo 6  |   assigned module     | Enable servo 7  |   assigned module
+  BIOLOID_MM_MODULE_EN4             = 0x4E, //      bit 7      | bit 6 | bit 5 | bit 4 |      bit 3      | bit 2 | bit 1 | bit 0
+                                            // Enable servo 8  |   assigned module     | Enable servo 9  |   assigned module
+  BIOLOID_MM_MODULE_EN5             = 0x4F, //      bit 7      | bit 6 | bit 5 | bit 4 |      bit 3      | bit 2 | bit 1 | bit 0
+                                            // Enable servo 10 |   assigned module     | Enable servo 11 |   assigned module
+  BIOLOID_MM_MODULE_EN6             = 0x50, //      bit 7      | bit 6 | bit 5 | bit 4 |      bit 3      | bit 2 | bit 1 | bit 0
+                                            // Enable servo 12 |   assigned module     | Enable servo 13 |   assigned module
+  BIOLOID_MM_MODULE_EN7             = 0x51, //      bit 7      | bit 6 | bit 5 | bit 4 |      bit 3      | bit 2 | bit 1 | bit 0
+                                            // Enable servo 14 |   assigned module     | Enable servo 15 |   assigned module
+  BIOLOID_MM_MODULE_EN8             = 0x52, //      bit 7      | bit 6 | bit 5 | bit 4 |      bit 3      | bit 2 | bit 1 | bit 0
+                                            // Enable servo 16 |   assigned module     | Enable servo 17 |   assigned module
+  BIOLOID_MM_MODULE_EN9             = 0x53, //      bit 7      | bit 6 | bit 5 | bit 4 |      bit 3      | bit 2 | bit 1 | bit 0
+                                            // Enable servo 18 |   assigned module     | Enable servo 19 |   assigned module
+  BIOLOID_MM_MODULE_EN10            = 0x54, //      bit 7      | bit 6 | bit 5 | bit 4 |      bit 3      | bit 2 | bit 1 | bit 0
+                                            // Enable servo 20 |   assigned module     | Enable servo 21 |   assigned module
+  BIOLOID_MM_MODULE_EN11            = 0x55, //      bit 7      | bit 6 | bit 5 | bit 4 |      bit 3      | bit 2 | bit 1 | bit 0
+                                            // Enable servo 22 |   assigned module     | Enable servo 23 |   assigned module
+  BIOLOID_MM_MODULE_EN12            = 0x56, //      bit 7      | bit 6 | bit 5 | bit 4 |      bit 3      | bit 2 | bit 1 | bit 0
+                                            // Enable servo 24 |   assigned module     | Enable servo 25 |   assigned module
+  BIOLOID_MM_MODULE_EN13            = 0x57, //      bit 7      | bit 6 | bit 5 | bit 4 |      bit 3      | bit 2 | bit 1 | bit 0
+                                            // Enable servo 26 |   assigned module     | Enable servo 27 |   assigned module
+  BIOLOID_MM_MODULE_EN14            = 0x58, //      bit 7      | bit 6 | bit 5 | bit 4 |      bit 3      | bit 2 | bit 1 | bit 0
+                                            // Enable servo 28 |   assigned module     | Enable servo 29 |   assigned module
+  BIOLOID_MM_MODULE_EN15            = 0x59, //      bit 7      | bit 6 | bit 5 | bit 4 |      bit 3      | bit 2 | bit 1 | bit 0
+                                            // Enable servo 30 |   assigned module     | Enable servo 31 |   assigned module
+  BIOLOID_MM_SERVO0_CUR_POS_L       = 0x5A, // angle in fixed point format 9|7
+  BIOLOID_MM_SERVO0_CUR_POS_H       = 0x5B,
+  BIOLOID_MM_SERVO1_CUR_POS_L       = 0x5C, // angle in fixed point format 9|7
+  BIOLOID_MM_SERVO1_CUR_POS_H       = 0x5D,
+  BIOLOID_MM_SERVO2_CUR_POS_L       = 0x5E, // angle in fixed point format 9|7
+  BIOLOID_MM_SERVO2_CUR_POS_H       = 0x5F,
+  BIOLOID_MM_SERVO3_CUR_POS_L       = 0x60, // angle in fixed point format 9|7
+  BIOLOID_MM_SERVO3_CUR_POS_H       = 0x61,
+  BIOLOID_MM_SERVO4_CUR_POS_L       = 0x62, // angle in fixed point format 9|7
+  BIOLOID_MM_SERVO4_CUR_POS_H       = 0x63,
+  BIOLOID_MM_SERVO5_CUR_POS_L       = 0x64, // angle in fixed point format 9|7
+  BIOLOID_MM_SERVO5_CUR_POS_H       = 0x65,
+  BIOLOID_MM_SERVO6_CUR_POS_L       = 0x66, // angle in fixed point format 9|7
+  BIOLOID_MM_SERVO6_CUR_POS_H       = 0x67,
+  BIOLOID_MM_SERVO7_CUR_POS_L       = 0x68, // angle in fixed point format 9|7
+  BIOLOID_MM_SERVO7_CUR_POS_H       = 0x69,
+  BIOLOID_MM_SERVO8_CUR_POS_L       = 0x6A, // angle in fixed point format 9|7
+  BIOLOID_MM_SERVO8_CUR_POS_H       = 0x6B,
+  BIOLOID_MM_SERVO9_CUR_POS_L       = 0x6C, // angle in fixed point format 9|7
+  BIOLOID_MM_SERVO9_CUR_POS_H       = 0x6D,
+  BIOLOID_MM_SERVO10_CUR_POS_L      = 0x6E, // angle in fixed point format 9|7
+  BIOLOID_MM_SERVO10_CUR_POS_H      = 0x6F,
+  BIOLOID_MM_SERVO11_CUR_POS_L      = 0x70, // angle in fixed point format 9|7
+  BIOLOID_MM_SERVO11_CUR_POS_H      = 0x71,
+  BIOLOID_MM_SERVO12_CUR_POS_L      = 0x72, // angle in fixed point format 9|7
+  BIOLOID_MM_SERVO12_CUR_POS_H      = 0x73,
+  BIOLOID_MM_SERVO13_CUR_POS_L      = 0x74, // angle in fixed point format 9|7
+  BIOLOID_MM_SERVO13_CUR_POS_H      = 0x75,
+  BIOLOID_MM_SERVO14_CUR_POS_L      = 0x76, // angle in fixed point format 9|7
+  BIOLOID_MM_SERVO14_CUR_POS_H      = 0x77,
+  BIOLOID_MM_SERVO15_CUR_POS_L      = 0x78, // angle in fixed point format 9|7
+  BIOLOID_MM_SERVO15_CUR_POS_H      = 0x79,
+  BIOLOID_MM_SERVO16_CUR_POS_L      = 0x7A, // angle in fixed point format 9|7
+  BIOLOID_MM_SERVO16_CUR_POS_H      = 0x7B,
+  BIOLOID_MM_SERVO17_CUR_POS_L      = 0x7C, // angle in fixed point format 9|7
+  BIOLOID_MM_SERVO17_CUR_POS_H      = 0x7D,
+  BIOLOID_MM_SERVO18_CUR_POS_L      = 0x7E, // angle in fixed point format 9|7
+  BIOLOID_MM_SERVO18_CUR_POS_H      = 0x7F,
+  BIOLOID_MM_SERVO19_CUR_POS_L      = 0x80, // angle in fixed point format 9|7
+  BIOLOID_MM_SERVO19_CUR_POS_H      = 0x81,
+  BIOLOID_MM_SERVO20_CUR_POS_L      = 0x82, // angle in fixed point format 9|7
+  BIOLOID_MM_SERVO20_CUR_POS_H      = 0x83,
+  BIOLOID_MM_SERVO21_CUR_POS_L      = 0x84, // angle in fixed point format 9|7
+  BIOLOID_MM_SERVO21_CUR_POS_H      = 0x85,
+  BIOLOID_MM_SERVO22_CUR_POS_L      = 0x86, // angle in fixed point format 9|7
+  BIOLOID_MM_SERVO22_CUR_POS_H      = 0x87,
+  BIOLOID_MM_SERVO23_CUR_POS_L      = 0x88, // angle in fixed point format 9|7
+  BIOLOID_MM_SERVO23_CUR_POS_H      = 0x89,
+  BIOLOID_MM_SERVO24_CUR_POS_L      = 0x8A, // angle in fixed point format 9|7
+  BIOLOID_MM_SERVO24_CUR_POS_H      = 0x8B,
+  BIOLOID_MM_SERVO25_CUR_POS_L      = 0x8C, // angle in fixed point format 9|7
+  BIOLOID_MM_SERVO25_CUR_POS_H      = 0x8D,
+  BIOLOID_MM_SERVO26_CUR_POS_L      = 0x8E, // angle in fixed point format 9|7
+  BIOLOID_MM_SERVO26_CUR_POS_H      = 0x8F,
+  BIOLOID_MM_SERVO27_CUR_POS_L      = 0x90, // angle in fixed point format 9|7
+  BIOLOID_MM_SERVO27_CUR_POS_H      = 0x91,
+  BIOLOID_MM_SERVO28_CUR_POS_L      = 0x92, // angle in fixed point format 9|7
+  BIOLOID_MM_SERVO28_CUR_POS_H      = 0x93,
+  BIOLOID_MM_SERVO29_CUR_POS_L      = 0x94, // angle in fixed point format 9|7
+  BIOLOID_MM_SERVO29_CUR_POS_H      = 0x95,
+  BIOLOID_MM_SERVO30_CUR_POS_L      = 0x96, // angle in fixed point format 9|7
+  BIOLOID_MM_SERVO30_CUR_POS_H      = 0x97,
+  BIOLOID_MM_SERVO31_CUR_POS_L      = 0x98, // angle in fixed point format 9|7
+  BIOLOID_MM_SERVO31_CUR_POS_H      = 0x99,
+  BIOLOID_ACTION_PAGE               = 0x9A,
+  BIOLOID_ACTION_CNTRL              = 0x9B, // bit 7 | bit 6 | bit 5 |     bit 4    |     bit 3      |       bit 2      |   bit 1   |   bit 0
+                                            //       |       |       | page running | interrupt flag | enable interrupt | stop page | start page
+  BIOLOID_GYRO_CNTRL                = 0x9C, // bit 7 | bit 6 | bit 5 | bit 4 |     bit 3       |       bit 2     |         bit 1        |   bit 0
+                                            //       |       |       |       | enable fall int | enable fall det | enable calibrate int | calibrate
+  BIOLOID_GYRO_STATUS               = 0x9D, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0
+                                            // 
+  BIOLOID_GYRO_FWD_FALL_THD         = 0x9E,
+  BIOLOID_GYRO_BWD_FALL_THD         = 0x9F,
+  BIOLOID_GYRO_LEFT_FALL_THD        = 0xA0,
+  BOILOID_GYRO_RIGHT_FALL_THD       = 0xA1
 } bioloid_registers;
 
-#define      GPIO_BASE_ADDRESS    0x20
-#define      GPIO_MEM_LENGTH      16
-#define      GPIO_INT_USED        0x01
-#define      GPIO_VALUE           0x02
-#define      GPIO_TOGGLE          0x04
-#define      GPIO_BLINK           0x08
-#define      GPIO_INT_EN          0x02
-#define      GPIO_INT_FLAG        0x04
+#define      GPIO_BASE_ADDRESS       0x20
+#define      GPIO_MEM_LENGTH         16
+#define      GPIO_INT_USED           0x01
+#define      GPIO_VALUE              0x02
+#define      GPIO_TOGGLE             0x04
+#define      GPIO_BLINK              0x08
+#define      GPIO_INT_EN             0x02
+#define      GPIO_INT_FLAG           0x04
 
-#define      ADC_BASE_ADDRESS     0x30
-#define      ADC_MEM_LENGTH       18
-#define      ADC_ENABLE           0x01
+#define      ADC_BASE_ADDRESS        0x30
+#define      ADC_MEM_LENGTH          18
+#define      ADC_ENABLE              0x01
 
-#define      ZIGBEE_BASE_ADDRESS  0x42
-#define      ZIGBEE_MEM_LENGTH    6
-#define      ZIGBEE_EN_PWR        0x01
-#define      ZIGBEE_ENABLE        0x02
+#define      ZIGBEE_BASE_ADDRESS     0x42
+#define      ZIGBEE_MEM_LENGTH       6
+#define      ZIGBEE_EN_PWR           0x01
+#define      ZIGBEE_ENABLE           0x02
 
-#define      MANAGER_BASE_ADDRESS 0x48
-#define      MANAGER_MEM_LENGTH   50
-#define      MANAGER_ENABLE       0x01
-#define      MANAGER_EN_BAL       0x02
-#define      MANAGER_EN_PWR       0x04
-#define      MANAGER_EVEN_SER_EN  0x80
-#define      MANAGER_EVEN_SER_MOD 0x70
-#define      MANAGER_ODD_SER_EN   0x08
-#define      MANAGER_ODD_SER_MOD  0x07
+#define      MANAGER_BASE_ADDRESS    0x48
+#define      MANAGER_MEM_LENGTH      50
+#define      MANAGER_EEPROM_LENGTH   10
+#define      MANAGER_ENABLE          0x01
+#define      MANAGER_EN_BAL          0x02
+#define      MANAGER_EN_PWR          0x04
+#define      MANAGER_EVEN_SER_EN     0x80
+#define      MANAGER_EVEN_SER_MOD    0x70
+#define      MANAGER_ODD_SER_EN      0x08
+#define      MANAGER_ODD_SER_MOD     0x07
 
-#define      ACTION_BASE_ADDRESS  0x9A
-#define      ACTION_MEM_LENGTH    2
-#define      ACTION_START         0x01
-#define      ACTION_STOP          0x02
-#define      ACTION_INT_EN        0x04
-#define      ACTION_INT_FLAG      0x08
-#define      ACTION_STATUS        0x10
+#define      ACTION_BASE_ADDRESS     0x9A
+#define      ACTION_MEM_LENGTH       2
+#define      ACTION_START            0x01
+#define      ACTION_STOP             0x02
+#define      ACTION_INT_EN           0x04
+#define      ACTION_INT_FLAG         0x08
+#define      ACTION_STATUS           0x10
 
-#define      GYRO_BASE_ADDRESS    0x9C
-#define      GYRO_MEM_LENGTH      6
-#define      GYRO_CALIBRATE       0x01
-#define      GYRO_EN_CAL_INT      0x02
-#define      GYRO_EN_FALL_DET     0x04
-#define      GYRO_EN_FALL_DET_INT 0x08
+#define      GYRO_BASE_ADDRESS       0x9C
+#define      GYRO_MEM_LENGTH         6
+#define      GYRO_CALIBRATE          0x01
+#define      GYRO_EN_CAL_INT         0x02
+#define      GYRO_EN_FALL_DET        0x04
+#define      GYRO_EN_FALL_DET_INT    0x08
 
 #ifdef __cplusplus
 }
diff --git a/include/motion_manager.h b/include/motion_manager.h
index 24441227d7f133f7cadb49a9356d8acbaeb9c736..3a1172a98a5fab9fb4db683993a1aee323eb00bc 100644
--- a/include/motion_manager.h
+++ b/include/motion_manager.h
@@ -7,10 +7,31 @@ extern "C" {
 
 #include "stm32f4xx_hal.h"
 
-typedef enum{MM_NONE          = 0,
-             MM_ACTION        = 1,
-             MM_WALKING       = 2,
-             MM_JOINTS        = 3} TModules;
+typedef enum {
+  R_SHOULDER_PITCH     = 1,
+  L_SHOULDER_PITCH     = 2,
+  R_SHOULDER_ROLL      = 3,
+  L_SHOULDER_ROLL      = 4,
+  R_ELBOW              = 5,
+  L_ELBOW              = 6,
+  R_HIP_YAW            = 7,
+  L_HIP_YAW            = 8,
+  R_HIP_ROLL           = 9,
+  L_HIP_ROLL           = 10,
+  R_HIP_PITCH          = 11,
+  L_HIP_PITCH          = 12,
+  R_KNEE               = 13,
+  L_KNEE               = 14,
+  R_ANKLE_PITCH        = 15,
+  L_ANKLE_PITCH        = 16,
+  R_ANKLE_ROLL         = 17,
+  L_ANKLE_ROLL         = 18} servo_id_t;
+
+
+typedef enum {MM_NONE          = 0,
+              MM_ACTION        = 1,
+              MM_WALKING       = 2,
+              MM_JOINTS        = 3} TModules;
 
 typedef struct
 {
diff --git a/src/bioloid_gyro.c b/src/bioloid_gyro.c
index 8587e386394a972bb131586462b654723f43b1b7..7c4d3dab8f5edfd6e95365d192e6fd4877bf81e0 100644
--- a/src/bioloid_gyro.c
+++ b/src/bioloid_gyro.c
@@ -36,6 +36,8 @@ void gyro_calibrate(void)
 
   gyro_fb_offset=0x0000;
   gyro_lr_offset=0x0000;
+  // dummy delay to allow enough time to the ADC to get new data
+  HAL_Delay(2*adc_get_period());    
   for(i=0;i<GYRO_MAX_CAL_SAMPLES;i++)
   {
     gyro_fb_offset+=adc_get_channel_raw(fb_ch);
diff --git a/src/eeprom.c b/src/eeprom.c
index 74e9ec522249cda4119266d3b321fa4a9bf4f687..68155b94ad2c0608c3ccdb1388c184cecd3545e3 100755
--- a/src/eeprom.c
+++ b/src/eeprom.c
@@ -42,19 +42,24 @@
 /* Includes ------------------------------------------------------------------*/
 #include "eeprom.h"
 #include "bioloid_registers.h"
+#include "adc_dma.h"
 
 /* Private typedef -----------------------------------------------------------*/
 /* Private define ------------------------------------------------------------*/
-#define    EEPROM_SIZE               0x09
-#define    DEFAULT_DEVICE_MODEL      0x7300
-#define    DEFAULT_FIRMWARE_VERSION  0x0001
-#define    DEFAULT_DEVICE_ID         0x0002
-#define    DEFAULT_BAUDRATE          0x0001
-#define    DEFAULT_RETURN_DELAY      0x0000
-#define    DEFAULT_MM_PERIOD         0x01FF
-#define    DEFAULT_GYRO_FB_ADC_CH    0x0002
-#define    DEFAULT_GYRO_LR_ADC_CH    0x0001
-#define    DEFAULT_RETURN_LEVEL      0x0002
+#define    EEPROM_SIZE                      0x20
+#define    DEFAULT_DEVICE_MODEL             0x7300
+#define    DEFAULT_FIRMWARE_VERSION         0x0001
+#define    DEFAULT_DEVICE_ID                0x0002
+#define    DEFAULT_BAUDRATE                 0x0001
+#define    DEFAULT_RETURN_DELAY             0x0000
+#define    DEFAULT_MM_PERIOD                0x01FF
+#define    DEFAULT_BAL_KNEE_GAIN            0x04BE // 1/54 in fixed point format 0|16
+#define    DEFAULT_BAL_ANKLE_ROLL_GAIN      0x0CCD // 1/20
+#define    DEFAULT_BAL_ANKLE_PITCH_GAIN     0x0E39 // 1/18
+#define    DEFAULT_BAL_HIP_ROLL_GAIN        0x0666 // 1/40
+#define    DEFAULT_GYRO_FB_ADC_CH           (uint16_t)ADC_CH1
+#define    DEFAULT_GYRO_LR_ADC_CH           (uint16_t)ADC_CH2
+#define    DEFAULT_RETURN_LEVEL             0x0002
 /* Private macro -------------------------------------------------------------*/
 /* Private variables ---------------------------------------------------------*/
 
@@ -80,12 +85,28 @@ uint16_t eeprom_data[] __attribute__ ((section (".eeprom")))={VALID_PAGE,
                                                               MM_PERIOD_OFFSET,
                                                               DEFAULT_MM_PERIOD>>8,
                                                               MM_PERIOD_OFFSET+1,
+                                                              DEFAULT_BAL_KNEE_GAIN&0xFF,
+                                                              MM_BAL_KNEE_GAIN_OFFSET,
+                                                              DEFAULT_BAL_KNEE_GAIN>>8,
+                                                              MM_BAL_KNEE_GAIN_OFFSET+1,
+                                                              DEFAULT_BAL_ANKLE_ROLL_GAIN&0xFF,
+                                                              MM_BAL_ANKLE_ROLL_GAIN_OFFSET,
+                                                              DEFAULT_BAL_ANKLE_ROLL_GAIN>>8,
+                                                              MM_BAL_ANKLE_ROLL_GAIN_OFFSET+1,
+                                                              DEFAULT_BAL_ANKLE_PITCH_GAIN&0xFF,
+                                                              MM_BAL_ANKLE_PITCH_GAIN_OFFSET,
+                                                              DEFAULT_BAL_ANKLE_PITCH_GAIN>>8,
+                                                              MM_BAL_ANKLE_PITCH_GAIN_OFFSET+1,
+                                                              DEFAULT_BAL_HIP_ROLL_GAIN&0xFF,
+                                                              MM_BAL_HIP_ROLL_GAIN_OFFSET,
+                                                              DEFAULT_BAL_HIP_ROLL_GAIN>>8,
+                                                              MM_BAL_HIP_ROLL_GAIN_OFFSET+1,
+                                                              DEFAULT_RETURN_LEVEL,
+                                                              RETURN_LEVEL_OFFSET,
                                                               DEFAULT_GYRO_FB_ADC_CH,
                                                               GYRO_FB_ADC_CH_OFFSET,
                                                               DEFAULT_GYRO_LR_ADC_CH,
-                                                              GYRO_LR_ADC_CH_OFFSET,
-                                                              DEFAULT_RETURN_LEVEL,
-                                                              RETURN_LEVEL_OFFSET};// return level
+                                                              GYRO_LR_ADC_CH_OFFSET};// return level
 
 /* Private function prototypes -----------------------------------------------*/
 /* Private functions ---------------------------------------------------------*/
diff --git a/src/motion_manager.c b/src/motion_manager.c
index dfed4f3c7596ce748a6eec40c9b2cd4e393e4b52..1c430c285ccb92951665886f790483d085a392c3 100644
--- a/src/motion_manager.c
+++ b/src/motion_manager.c
@@ -106,25 +106,31 @@ void manager_get_target_position(void)
 void manager_balance(void)
 {
   adc_ch_t fb_ch=gyro_get_fb_adc_channel(),lr_ch=gyro_get_lr_adc_channel();
+  int16_t knee_gain,ankle_roll_gain,ankle_pitch_gain,hip_roll_gain;
   uint16_t fb_offset,lr_offset;
   int16_t fb_value,lr_value;
 
   if(manager_balance_enabled==0x01)// balance is enabled
   {
+    // get the balance gains
+    knee_gain=ram_data[BIOLOID_MM_BAL_KNEE_GAIN_L]+(ram_data[BIOLOID_MM_BAL_KNEE_GAIN_H]*256);
+    ankle_roll_gain=ram_data[BIOLOID_MM_BAL_ANKLE_ROLL_GAIN_L]+(ram_data[BIOLOID_MM_BAL_ANKLE_ROLL_GAIN_H]<<8);
+    ankle_pitch_gain=ram_data[BIOLOID_MM_BAL_ANKLE_PITCH_GAIN_L]+(ram_data[BIOLOID_MM_BAL_ANKLE_PITCH_GAIN_H]<<8);
+    hip_roll_gain=ram_data[BIOLOID_MM_BAL_HIP_ROLL_GAIN_L]+(ram_data[BIOLOID_MM_BAL_HIP_ROLL_GAIN_H]<<8);
     // get the offsets of the gyroscope calibration
     gyro_get_offsets(&fb_offset,&lr_offset);
     // get the values of the gyroscope
     fb_value=adc_get_channel_raw(fb_ch)-fb_offset;
     lr_value=adc_get_channel_raw(lr_ch)-lr_offset;
     // compensate the servo angle values
-    manager_balance_offset[13]=(fb_value*manager_servos[13].max_angle)/(manager_servos[13].encoder_resolution*54);
-    manager_balance_offset[15]=(fb_value*manager_servos[15].max_angle)/(manager_servos[15].encoder_resolution*18);    
-    manager_balance_offset[14]=-(fb_value*manager_servos[14].max_angle)/(manager_servos[14].encoder_resolution*54);    
-    manager_balance_offset[16]=-(fb_value*manager_servos[16].max_angle)/(manager_servos[16].encoder_resolution*18);
-    manager_balance_offset[9]=(lr_value*manager_servos[9].max_angle)/(manager_servos[9].encoder_resolution*40);
-    manager_balance_offset[10]=(lr_value*manager_servos[10].max_angle)/(manager_servos[10].encoder_resolution*40);
-    manager_balance_offset[17]=-(lr_value*manager_servos[17].max_angle)/(manager_servos[17].encoder_resolution*20);
-    manager_balance_offset[18]=-(lr_value*manager_servos[18].max_angle)/(manager_servos[18].encoder_resolution*20);
+    manager_balance_offset[R_KNEE]=(((fb_value*manager_servos[R_KNEE].max_angle)/manager_servos[R_KNEE].encoder_resolution)*knee_gain)/65536;
+    manager_balance_offset[R_ANKLE_PITCH]=(((fb_value*manager_servos[R_ANKLE_PITCH].max_angle)/manager_servos[R_ANKLE_PITCH].encoder_resolution)*ankle_pitch_gain)/65536;    
+    manager_balance_offset[L_KNEE]=-(((fb_value*manager_servos[L_KNEE].max_angle)/manager_servos[L_KNEE].encoder_resolution)*knee_gain)/65536;    
+    manager_balance_offset[L_ANKLE_PITCH]=-(((fb_value*manager_servos[L_ANKLE_PITCH].max_angle)/manager_servos[L_ANKLE_PITCH].encoder_resolution)*ankle_pitch_gain)/65536;
+    manager_balance_offset[R_HIP_ROLL]=(((lr_value*manager_servos[R_HIP_ROLL].max_angle)/manager_servos[R_HIP_ROLL].encoder_resolution)*hip_roll_gain)/65536;
+    manager_balance_offset[L_HIP_ROLL]=(((lr_value*manager_servos[L_HIP_ROLL].max_angle)/manager_servos[L_HIP_ROLL].encoder_resolution)*hip_roll_gain)/65536;
+    manager_balance_offset[R_ANKLE_ROLL]=-(((lr_value*manager_servos[R_ANKLE_ROLL].max_angle)/manager_servos[R_ANKLE_ROLL].encoder_resolution)*ankle_roll_gain)/65536;
+    manager_balance_offset[L_ANKLE_ROLL]=-(((lr_value*manager_servos[L_ANKLE_ROLL].max_angle)/manager_servos[L_ANKLE_ROLL].encoder_resolution)*ankle_roll_gain)/65536;
   }
 }
 
@@ -456,7 +462,7 @@ inline int16_t manager_get_ccw_angle_limit(uint8_t servo_id)
 uint8_t manager_in_range(unsigned short int address, unsigned short int length)
 {
   if(ram_in_window(MANAGER_BASE_ADDRESS,MANAGER_MEM_LENGTH,address,length) ||
-     ram_in_window(BIOLOID_MM_PERIOD_L,BIOLOID_MM_PERIOD_H,address,length))
+     ram_in_window(BIOLOID_MM_PERIOD_L,MANAGER_EEPROM_LENGTH,address,length))
     return 0x01;
   else
     return 0x00;
diff --git a/src/ram.c b/src/ram.c
index 7d49db96fccbe5d383208610011af1fb552f5454..046ecab0f6a13b1c3644b929e768cb68a7fde03e 100644
--- a/src/ram.c
+++ b/src/ram.c
@@ -26,8 +26,28 @@ void ram_init(void)
     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(MM_BAL_KNEE_GAIN_OFFSET,&eeprom_data)==0)
+    ram_data[MM_BAL_KNEE_GAIN_OFFSET]=(uint8_t)(eeprom_data&0x00FF);
+  if(EE_ReadVariable(MM_BAL_KNEE_GAIN_OFFSET+1,&eeprom_data)==0)
+    ram_data[MM_BAL_KNEE_GAIN_OFFSET+1]=(uint8_t)(eeprom_data&0x00FF);
+  if(EE_ReadVariable(MM_BAL_ANKLE_ROLL_GAIN_OFFSET,&eeprom_data)==0)
+    ram_data[MM_BAL_ANKLE_ROLL_GAIN_OFFSET]=(uint8_t)(eeprom_data&0x00FF);
+  if(EE_ReadVariable(MM_BAL_ANKLE_ROLL_GAIN_OFFSET+1,&eeprom_data)==0)
+    ram_data[MM_BAL_ANKLE_ROLL_GAIN_OFFSET+1]=(uint8_t)(eeprom_data&0x00FF);
+  if(EE_ReadVariable(MM_BAL_ANKLE_PITCH_GAIN_OFFSET,&eeprom_data)==0)
+    ram_data[MM_BAL_ANKLE_PITCH_GAIN_OFFSET]=(uint8_t)(eeprom_data&0x00FF);
+  if(EE_ReadVariable(MM_BAL_ANKLE_PITCH_GAIN_OFFSET+1,&eeprom_data)==0)
+    ram_data[MM_BAL_ANKLE_PITCH_GAIN_OFFSET+1]=(uint8_t)(eeprom_data&0x00FF);
+  if(EE_ReadVariable(MM_BAL_HIP_ROLL_GAIN_OFFSET,&eeprom_data)==0)
+    ram_data[MM_BAL_HIP_ROLL_GAIN_OFFSET]=(uint8_t)(eeprom_data&0x00FF);
+  if(EE_ReadVariable(MM_BAL_HIP_ROLL_GAIN_OFFSET+1,&eeprom_data)==0)
+    ram_data[MM_BAL_HIP_ROLL_GAIN_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;
+  if(EE_ReadVariable(GYRO_FB_ADC_CH_OFFSET,&eeprom_data)==0)
+    ram_data[GYRO_FB_ADC_CH_OFFSET]=(uint8_t)(eeprom_data&0x00FF);
+  if(EE_ReadVariable(GYRO_LR_ADC_CH_OFFSET,&eeprom_data)==0)
+    ram_data[GYRO_LR_ADC_CH_OFFSET]=(uint8_t)(eeprom_data&0x00FF);
 }
 
 inline void ram_read_byte(uint8_t address,uint8_t *data)