diff --git a/include/darwin_registers.h b/include/darwin_registers.h
index c91a8321d5c29ef6ede370b25527631cfc9128af..8b5c1913202a02e71889b2a537a98d92ded6df50 100644
--- a/include/darwin_registers.h
+++ b/include/darwin_registers.h
@@ -75,15 +75,17 @@ extern "C" {
 #define HEAD_TILT_I                     ((unsigned short int)0x004E)
 #define HEAD_TILT_D                     ((unsigned short int)0x0050)
 #define HEAD_TILT_I_CLAMP               ((unsigned short int)0x0052)
-#define GRIPPER_LEFT_ID                 ((unsigned short int)0x0054)
-#define GRIPPER_LEFT_MAX_ANGLE          ((unsigned short int)0x0055)
-#define GRIPPER_LEFT_MIN_ANGLE          ((unsigned short int)0x0057)
-#define GRIPPER_LEFT_MAX_FORCE          ((unsigned short int)0x0059)
-#define GRIPPER_RIGHT_ID                ((unsigned short int)0x005B)
-#define GRIPPER_RIGHT_MAX_ANGLE         ((unsigned short int)0x005C)
-#define GRIPPER_RIGHT_MIN_ANGLE         ((unsigned short int)0x005E)
-#define GRIPPER_RIGHT_MAX_FORCE         ((unsigned short int)0x0060)
-#define SMART_CHARGER_PERIOD            ((unsigned short int)0x0062)
+#define GRIPPER_LEFT_TOP_ID             ((unsigned short int)0x0054)
+#define GRIPPER_LEFT_BOT_ID             ((unsigned short int)0x0055)
+#define GRIPPER_LEFT_MAX_ANGLE          ((unsigned short int)0x0056)
+#define GRIPPER_LEFT_MIN_ANGLE          ((unsigned short int)0x0058)
+#define GRIPPER_LEFT_MAX_FORCE          ((unsigned short int)0x005A)
+#define GRIPPER_RIGHT_TOP_ID            ((unsigned short int)0x005C)
+#define GRIPPER_RIGHT_BOT_ID            ((unsigned short int)0x005D)
+#define GRIPPER_RIGHT_MAX_ANGLE         ((unsigned short int)0x005E)
+#define GRIPPER_RIGHT_MIN_ANGLE         ((unsigned short int)0x0060)
+#define GRIPPER_RIGHT_MAX_FORCE         ((unsigned short int)0x0062)
+#define SMART_CHARGER_PERIOD            ((unsigned short int)0x0064)
 
 #define LAST_EEPROM_OFFSET              ((unsigned short int)0x00FF)
 
@@ -172,14 +174,16 @@ typedef enum {
   DARWIN_HEAD_TILT_D_H                 = HEAD_TILT_D+1,
   DARWIN_HEAD_TILT_I_CLAMP_L           = HEAD_TILT_I_CLAMP,// max error in fixed point format 9|7 
   DARWIN_HEAD_TILT_I_CLAMP_H           = HEAD_TILT_I_CLAMP+1,
-  DARWIN_GRIPPER_LEFT_ID               = GRIPPER_LEFT_ID,
+  DARWIN_GRIPPER_LEFT_TOP_ID           = GRIPPER_LEFT_TOP_ID,
+  DARWIN_GRIPPER_LEFT_BOT_ID           = GRIPPER_LEFT_BOT_ID,
   DARWIN_GRIPPER_LEFT_MAX_ANGLE_L      = GRIPPER_LEFT_MAX_ANGLE,
   DARWIN_GRIPPER_LEFT_MAX_ANGLE_H      = GRIPPER_LEFT_MAX_ANGLE+1,
   DARWIN_GRIPPER_LEFT_MIN_ANGLE_L      = GRIPPER_LEFT_MIN_ANGLE,
   DARWIN_GRIPPER_LEFT_MIN_ANGLE_H      = GRIPPER_LEFT_MIN_ANGLE+1,
   DARWIN_GRIPPER_LEFT_MAX_FORCE_L      = GRIPPER_LEFT_MAX_FORCE,
   DARWIN_GRIPPER_LEFT_MAX_FORCE_H      = GRIPPER_LEFT_MAX_FORCE+1,
-  DARWIN_GRIPPER_RIGHT_ID              = GRIPPER_RIGHT_ID,
+  DARWIN_GRIPPER_RIGHT_TOP_ID          = GRIPPER_RIGHT_TOP_ID,
+  DARWIN_GRIPPER_RIGHT_BOT_ID          = GRIPPER_RIGHT_BOT_ID,
   DARWIN_GRIPPER_RIGHT_MAX_ANGLE_L     = GRIPPER_RIGHT_MAX_ANGLE,
   DARWIN_GRIPPER_RIGHT_MAX_ANGLE_H     = GRIPPER_RIGHT_MAX_ANGLE+1,
   DARWIN_GRIPPER_RIGHT_MIN_ANGLE_L     = GRIPPER_RIGHT_MIN_ANGLE,
@@ -580,8 +584,8 @@ typedef enum {
   DARWIN_SMART_CHARGER_BATT_STATUS_H     = 0x024F,
   DARWIN_SMART_CHARGER_CNTRL             = 0x0250, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 |    bit 1   |   bit 0
                                                    //                                               |  detected  |  enable    
-  DARWIN_GRIPPER_CNTRL                   = 0x0251  //    bit 7    |     bit 6    | bit 5 | bit 4 |    bit 3   |    bit 2   |    bit 1    |   bit 0
-                                                    // left opened | right opened |       |       | close left | open left  | close right | open right 
+  DARWIN_GRIPPER_CNTRL                   = 0x0251  //    bit 7    |     bit 6    |    bit 5    |     bit 4    |    bit 3   |    bit 2   |    bit 1    |   bit 0
+                                                   // left opened | right opened | left moving | right moving | close left | open left  | close right | open right 
 }darwin_registers;
 
 #define      GPIO_BASE_ADDRESS       0x0100
@@ -668,11 +672,15 @@ typedef enum {
 #define      GRIPPER_BASE_ADDRESS    0x0251
 #define      GRIPPER_MEM_LENGTH      1
 #define      GRIPPER_EEPROM_ADDRESS  0x0054
-#define      GRIPPER_EEPROM_LENGTH   14
+#define      GRIPPER_EEPROM_LENGTH   16
 #define      GRIPPER_OPEN_RIGHT      0x01
 #define      GRIPPER_CLOSE_RIGHT     0x02
 #define      GRIPPER_OPEN_LEFT       0x04
 #define      GRIPPER_CLOSE_LEFT      0x08
+#define      GRIPPER_MOVING_LEFT     0x20
+#define      GRIPPER_MOVING_RIGHT    0x10
+#define      GRIPPER_OPENED_LEFT     0x80
+#define      GRIPPER_OPENED_RIGHT    0x40
 
 #define      SMART_CHARGER_BASE_ADDRESS    0x0247
 #define      SMART_CHARGER_MEM_LENGTH      11
diff --git a/include/eeprom_init.h b/include/eeprom_init.h
index dafe22333ba7cca14136c3498c54dc9a1905e9b5..e7ae5eb6f83eb5c9810fc8ea54067e0a04101119 100644
--- a/include/eeprom_init.h
+++ b/include/eeprom_init.h
@@ -73,11 +73,13 @@ extern "C" {
 #define    DEFAULT_HEAD_TILT_I                  0x0000 // 0.0 in fixed point format 0|16
 #define    DEFAULT_HEAD_TILT_D                  0x0000 // 0.0 in fixed point format 0|16
 #define    DEFAULT_HEAD_TILT_I_CLAMP            0x0000 // 0.0 in fixed point format 9|7
-#define    DEFAULT_GRIPPER_LEFT_ID              0x0017 // ID 23 for the left gripper
+#define    DEFAULT_GRIPPER_LEFT_TOP_ID          0x0015 // ID 21 for the left gripper
+#define    DEFAULT_GRIPPER_LEFT_BOT_ID          0x0016 // ID 22 for the left gripper
 #define    DEFAULT_GRIPPER_LEFT_MAX_ANGLE       0x0F00 // 30 in fixed point format 9|7
 #define    DEFAULT_GRIPPER_LEFT_MIN_ANGLE       0xF100 // -30 in fixed point format 9|7
 #define    DEFAULT_GRIPPER_LEFT_MAX_FORCE       0x03FF // 1023 max force in binary format
-#define    DEFAULT_GRIPPER_RIGHT_ID             0x0018 // ID 24 for the left gripper
+#define    DEFAULT_GRIPPER_RIGHT_TOP_ID         0x0017 // ID 23 for the left gripper
+#define    DEFAULT_GRIPPER_RIGHT_BOT_ID         0x0018 // ID 24 for the left gripper
 #define    DEFAULT_GRIPPER_RIGHT_MAX_ANGLE      0x0F00 // 30 in fixed point format 9|7
 #define    DEFAULT_GRIPPER_RIGHT_MIN_ANGLE      0xF100 // -30 in fixed point format 9|7
 #define    DEFAULT_GRIPPER_RIGHT_MAX_FORCE      0x03FF // 1023 max force in binary format
diff --git a/include/grippers.h b/include/grippers.h
index 9df31bcba3b0a176d7c83c76f7a89e40b98b23b2..9a1aa5fd90e5c64d1cc75a9bac5fe51f73109634 100644
--- a/include/grippers.h
+++ b/include/grippers.h
@@ -16,13 +16,15 @@ inline void grippers_set_period(uint16_t period_us);
 inline uint16_t grippers_get_period(void);
 void grippers_open(grippers_t gripper);
 void grippers_close(grippers_t gripper);
+void grippers_stop(grippers_t gripper);
 uint8_t gripper_is_open(grippers_t gripper);
+uint8_t gripper_is_close(grippers_t gripper);
+uint8_t gripper_is_moving(grippers_t gripper);
 
 // operation functions
 uint8_t grippers_in_range(unsigned short int address, unsigned short int length);
 void grippers_process_read_cmd(unsigned short int address,unsigned short int length,unsigned char *data);
 void grippers_process_write_cmd(unsigned short int address,unsigned short int length,unsigned char *data);
-// motion manager interface functions
 void grippers_process(void);
 
 #ifdef __cplusplus
diff --git a/include/motion_manager.h b/include/motion_manager.h
index 641c39d8debe1b66a42cb213e7f7faff44104e63..d0f234ce1e61bd2eefffab36a056d07729157523 100755
--- a/include/motion_manager.h
+++ b/include/motion_manager.h
@@ -29,7 +29,11 @@ typedef enum {
   R_ANKLE_ROLL         = 17,
   L_ANKLE_ROLL         = 18,
   L_PAN                = 19,
-  L_TILT               = 20} servo_id_t;
+  L_TILT               = 20,
+  L_GRIPPER_TOP        = 21,
+  L_GRIPPER_BOT        = 22,
+  R_GRIPPER_TOP        = 23,
+  R_GRIPPER_BOT        = 24} servo_id_t;
 
 
 typedef enum {MM_NONE          = 0,
@@ -38,9 +42,9 @@ typedef enum {MM_NONE          = 0,
               MM_JOINTS        = 3,
               MM_HEAD          = 4} TModules;
 
-typedef enum {MM_FWD_FALL      =0,
-              MM_BWD_FALL      =1, 
-              MM_STANDING      =2} TFall;
+typedef enum {MM_FWD_FALL      = 0,
+              MM_BWD_FALL      = 1, 
+              MM_STANDING      = 2} TFall;
 
 typedef struct
 {
diff --git a/src/eeprom.c b/src/eeprom.c
index 4fa6f8e2edc57ca67b5fee4864dcde49817fbf91..fbb5a1a8caf6dd6e796739c795ad05376e2c41d6 100755
--- a/src/eeprom.c
+++ b/src/eeprom.c
@@ -139,14 +139,16 @@ uint16_t eeprom_data[] __attribute__ ((section (".eeprom")))={VALID_PAGE,
                                                               DEFAULT_HEAD_TILT_D>>8,                    HEAD_TILT_D+1,
                                                               DEFAULT_HEAD_TILT_I_CLAMP&0xFF,            HEAD_TILT_I_CLAMP,
                                                               DEFAULT_HEAD_TILT_I_CLAMP>>8,              HEAD_TILT_I_CLAMP+1,
-                                                              DEFAULT_GRIPPER_LEFT_ID,                   GRIPPER_LEFT_ID,
+                                                              DEFAULT_GRIPPER_LEFT_TOP_ID,               GRIPPER_LEFT_TOP_ID,
+                                                              DEFAULT_GRIPPER_LEFT_BOT_ID,               GRIPPER_LEFT_BOT_ID,
                                                               DEFAULT_GRIPPER_LEFT_MAX_ANGLE&0xFF,       GRIPPER_LEFT_MAX_ANGLE,
                                                               DEFAULT_GRIPPER_LEFT_MAX_ANGLE>>8,         GRIPPER_LEFT_MAX_ANGLE+1,
                                                               DEFAULT_GRIPPER_LEFT_MIN_ANGLE&0xFF,       GRIPPER_LEFT_MIN_ANGLE,
                                                               DEFAULT_GRIPPER_LEFT_MIN_ANGLE>>8,         GRIPPER_LEFT_MIN_ANGLE+1,
                                                               DEFAULT_GRIPPER_LEFT_MAX_FORCE&0xFF,       GRIPPER_LEFT_MAX_FORCE,
                                                               DEFAULT_GRIPPER_LEFT_MAX_FORCE>>8,         GRIPPER_LEFT_MAX_FORCE+1,
-                                                              DEFAULT_GRIPPER_RIGHT_ID,                  GRIPPER_RIGHT_ID,
+                                                              DEFAULT_GRIPPER_RIGHT_TOP_ID,              GRIPPER_RIGHT_TOP_ID,
+                                                              DEFAULT_GRIPPER_RIGHT_BOT_ID,              GRIPPER_RIGHT_BOT_ID,
                                                               DEFAULT_GRIPPER_RIGHT_MAX_ANGLE&0xFF,      GRIPPER_RIGHT_MAX_ANGLE,
                                                               DEFAULT_GRIPPER_RIGHT_MAX_ANGLE>>8,        GRIPPER_RIGHT_MAX_ANGLE+1,
                                                               DEFAULT_GRIPPER_RIGHT_MIN_ANGLE&0xFF,      GRIPPER_RIGHT_MIN_ANGLE,
diff --git a/src/grippers.c b/src/grippers.c
index c5fae087946fe969081ef44b37459cbbd41ee25c..5544346b9a44459ee306563a05523dfe20bb66d9 100644
--- a/src/grippers.c
+++ b/src/grippers.c
@@ -2,42 +2,48 @@
 #include "dyn_servos.h"
 #include "grippers.h"
 #include "ram.h"
+#include "joint_motion.h"
 
 // private variables
 int64_t grippers_period;
 int16_t grippers_period_us;
-uint8_t grippers_left_opened;
-uint8_t grippers_left_open;
-uint8_t grippers_left_close;
-uint8_t grippers_right_opened;
-uint8_t grippers_right_open;
-uint8_t grippers_right_close;
+uint8_t gripper_left_target;
+uint8_t gripper_right_target;
 
 // public functions
 void grippers_init(uint16_t period_us)
 {
   uint16_t force;
+  uint32_t servo_mask=0x00000000;
 
   /* initialize private variables */
-  grippers_left_opened=0x00;
-  grippers_left_open=0x00;
-  grippers_left_close=0x00;
-  grippers_right_opened=0x00;
-  grippers_right_open=0x00;
-  grippers_right_close=0x00;
+  gripper_left_target=0x00;//close;
+  gripper_right_target=0x00;//close;
   grippers_period=(period_us<<16)/1000000;
   grippers_period_us=period_us;
   /* configure the maximum force of the servos */
-  if(ram_data[DARWIN_GRIPPER_LEFT_ID]!=0xFF)
+  servo_mask=0x00000000;
+  if(ram_data[DARWIN_GRIPPER_LEFT_TOP_ID]!=0xFF && ram_data[DARWIN_GRIPPER_LEFT_BOT_ID]!=0xFF)
   {
     force=ram_data[DARWIN_GRIPPER_LEFT_MAX_FORCE_L]+(ram_data[DARWIN_GRIPPER_LEFT_MAX_FORCE_H]<<8);
-    dyn_master_write_word(&darwin_dyn_master_v2,ram_data[DARWIN_GRIPPER_LEFT_ID],XL_TORQUE_LIMIT_L,force);
+    dyn_master_write_word(&darwin_dyn_master_v2,ram_data[DARWIN_GRIPPER_LEFT_TOP_ID],XL_TORQUE_LIMIT_L,force);
+    dyn_master_write_word(&darwin_dyn_master_v2,ram_data[DARWIN_GRIPPER_LEFT_BOT_ID],XL_TORQUE_LIMIT_L,force);
+    servo_mask|=1<<ram_data[DARWIN_GRIPPER_LEFT_TOP_ID];
+    servo_mask|=1<<ram_data[DARWIN_GRIPPER_LEFT_BOT_ID];
+    joint_motion_set_group_servos(1,servo_mask);
   }
-  if(ram_data[DARWIN_GRIPPER_RIGHT_ID]!=0xFF)
+  servo_mask=0x00000000;
+  if(ram_data[DARWIN_GRIPPER_RIGHT_TOP_ID]!=0xFF && ram_data[DARWIN_GRIPPER_RIGHT_BOT_ID]!=0xFF)
   {
     force=ram_data[DARWIN_GRIPPER_RIGHT_MAX_FORCE_L]+(ram_data[DARWIN_GRIPPER_RIGHT_MAX_FORCE_H]<<8);
-    dyn_master_write_word(&darwin_dyn_master_v2,ram_data[DARWIN_GRIPPER_RIGHT_ID],XL_TORQUE_LIMIT_L,force);
+    dyn_master_write_word(&darwin_dyn_master_v2,ram_data[DARWIN_GRIPPER_RIGHT_TOP_ID],XL_TORQUE_LIMIT_L,force);
+    dyn_master_write_word(&darwin_dyn_master_v2,ram_data[DARWIN_GRIPPER_RIGHT_BOT_ID],XL_TORQUE_LIMIT_L,force);
+    servo_mask|=1<<ram_data[DARWIN_GRIPPER_RIGHT_TOP_ID];
+    servo_mask|=1<<ram_data[DARWIN_GRIPPER_RIGHT_BOT_ID];
+    joint_motion_set_group_servos(2,servo_mask);
   }
+  grippers_close(GRIPPER_LEFT);
+  grippers_close(GRIPPER_RIGHT);
 }
 
 inline void grippers_set_period(uint16_t period_us)
@@ -54,27 +60,101 @@ inline uint16_t grippers_get_period(void)
 void grippers_open(grippers_t gripper)
 {
   if(gripper==GRIPPER_LEFT)
-    grippers_left_open=0x01;
+  {
+    ram_data[DARWIN_JOINT_SERVO0_ANGLE_L+ram_data[DARWIN_GRIPPER_LEFT_TOP_ID]*2]=ram_data[DARWIN_GRIPPER_RIGHT_MAX_ANGLE_L];
+    ram_data[DARWIN_JOINT_SERVO0_ANGLE_L+ram_data[DARWIN_GRIPPER_LEFT_TOP_ID]*2+1]=ram_data[DARWIN_GRIPPER_RIGHT_MAX_ANGLE_H];
+    ram_data[DARWIN_JOINT_SERVO0_SPEED+ram_data[DARWIN_GRIPPER_LEFT_TOP_ID]]=60;
+    ram_data[DARWIN_JOINT_SERVO0_ANGLE_L+ram_data[DARWIN_GRIPPER_LEFT_BOT_ID]*2]=ram_data[DARWIN_GRIPPER_RIGHT_MAX_ANGLE_L];
+    ram_data[DARWIN_JOINT_SERVO0_ANGLE_L+ram_data[DARWIN_GRIPPER_LEFT_BOT_ID]*2+1]=ram_data[DARWIN_GRIPPER_RIGHT_MAX_ANGLE_H];
+    ram_data[DARWIN_JOINT_SERVO0_SPEED+ram_data[DARWIN_GRIPPER_LEFT_BOT_ID]]=60;
+    joint_motion_start(1);
+  }
   else if(gripper==GRIPPER_RIGHT)
-    grippers_right_open=0x01;
+  {
+    ram_data[DARWIN_JOINT_SERVO0_ANGLE_L+ram_data[DARWIN_GRIPPER_RIGHT_TOP_ID]*2]=ram_data[DARWIN_GRIPPER_RIGHT_MAX_ANGLE_L];
+    ram_data[DARWIN_JOINT_SERVO0_ANGLE_L+ram_data[DARWIN_GRIPPER_RIGHT_TOP_ID]*2+1]=ram_data[DARWIN_GRIPPER_RIGHT_MAX_ANGLE_H];
+    ram_data[DARWIN_JOINT_SERVO0_SPEED+ram_data[DARWIN_GRIPPER_RIGHT_TOP_ID]]=60;
+    ram_data[DARWIN_JOINT_SERVO0_ANGLE_L+ram_data[DARWIN_GRIPPER_RIGHT_BOT_ID]*2]=ram_data[DARWIN_GRIPPER_RIGHT_MAX_ANGLE_L];
+    ram_data[DARWIN_JOINT_SERVO0_ANGLE_L+ram_data[DARWIN_GRIPPER_RIGHT_BOT_ID]*2+1]=ram_data[DARWIN_GRIPPER_RIGHT_MAX_ANGLE_H];
+    ram_data[DARWIN_JOINT_SERVO0_SPEED+ram_data[DARWIN_GRIPPER_RIGHT_BOT_ID]]=60;
+    joint_motion_start(2);
+  }
 }
 
 void grippers_close(grippers_t gripper)
 {
   if(gripper==GRIPPER_LEFT)
-    grippers_left_close=0x01;
+  {
+    ram_data[DARWIN_JOINT_SERVO0_ANGLE_L+ram_data[DARWIN_GRIPPER_LEFT_TOP_ID]*2]=ram_data[DARWIN_GRIPPER_RIGHT_MIN_ANGLE_L];
+    ram_data[DARWIN_JOINT_SERVO0_ANGLE_L+ram_data[DARWIN_GRIPPER_LEFT_TOP_ID]*2+1]=ram_data[DARWIN_GRIPPER_RIGHT_MIN_ANGLE_H];
+    ram_data[DARWIN_JOINT_SERVO0_SPEED+ram_data[DARWIN_GRIPPER_LEFT_TOP_ID]]=60;
+    ram_data[DARWIN_JOINT_SERVO0_ANGLE_L+ram_data[DARWIN_GRIPPER_LEFT_BOT_ID]*2]=ram_data[DARWIN_GRIPPER_RIGHT_MIN_ANGLE_L];
+    ram_data[DARWIN_JOINT_SERVO0_ANGLE_L+ram_data[DARWIN_GRIPPER_LEFT_BOT_ID]*2+1]=ram_data[DARWIN_GRIPPER_RIGHT_MIN_ANGLE_H];
+    ram_data[DARWIN_JOINT_SERVO0_SPEED+ram_data[DARWIN_GRIPPER_LEFT_BOT_ID]]=60;
+    joint_motion_start(1);
+  }
   else if(gripper==GRIPPER_RIGHT)
-    grippers_right_close=0x01;
+  {
+    ram_data[DARWIN_JOINT_SERVO0_ANGLE_L+ram_data[DARWIN_GRIPPER_RIGHT_TOP_ID]*2]=ram_data[DARWIN_GRIPPER_RIGHT_MIN_ANGLE_L];
+    ram_data[DARWIN_JOINT_SERVO0_ANGLE_L+ram_data[DARWIN_GRIPPER_RIGHT_TOP_ID]*2+1]=ram_data[DARWIN_GRIPPER_RIGHT_MIN_ANGLE_H];
+    ram_data[DARWIN_JOINT_SERVO0_SPEED+ram_data[DARWIN_GRIPPER_RIGHT_TOP_ID]]=60;
+    ram_data[DARWIN_JOINT_SERVO0_ANGLE_L+ram_data[DARWIN_GRIPPER_RIGHT_BOT_ID]*2]=ram_data[DARWIN_GRIPPER_RIGHT_MIN_ANGLE_L];
+    ram_data[DARWIN_JOINT_SERVO0_ANGLE_L+ram_data[DARWIN_GRIPPER_RIGHT_BOT_ID]*2+1]=ram_data[DARWIN_GRIPPER_RIGHT_MIN_ANGLE_H];
+    ram_data[DARWIN_JOINT_SERVO0_SPEED+ram_data[DARWIN_GRIPPER_RIGHT_BOT_ID]]=60;
+    joint_motion_start(2);
+  }
+}
+
+void grippers_stop(grippers_t gripper)
+{
+  if(gripper==GRIPPER_LEFT)
+    joint_motion_stop(1);
+  else
+    joint_motion_stop(2);
 }
 
 uint8_t gripper_is_open(grippers_t gripper)
 {
   if(gripper==GRIPPER_LEFT)
-    return grippers_left_opened;
-  else if(gripper==GRIPPER_RIGHT)
-    return grippers_right_opened;
+  {
+    if(ram_data[DARWIN_GRIPPER_CNTRL]&GRIPPER_OPENED_LEFT)
+      return 0x01;
+    else
+      return 0x00;
+  }
   else
-    return 0x00;
+  {
+    if(ram_data[DARWIN_GRIPPER_CNTRL]&GRIPPER_OPENED_RIGHT)
+      return 0x01;
+    else
+      return 0x00;
+  }
+}
+
+uint8_t gripper_is_close(grippers_t gripper)
+{
+  if(gripper==GRIPPER_LEFT)
+  {
+    if(ram_data[DARWIN_GRIPPER_CNTRL]&GRIPPER_OPENED_LEFT)
+      return 0x00;
+    else
+      return 0x01;
+  }
+  else
+  {
+    if(ram_data[DARWIN_GRIPPER_CNTRL]&GRIPPER_OPENED_RIGHT)
+      return 0x00;
+    else
+      return 0x01;
+  }
+}
+
+uint8_t gripper_is_moving(grippers_t gripper)
+{
+  if(gripper==GRIPPER_LEFT)
+    return are_joints_moving(1);
+  else
+    return are_joints_moving(2);
 }
 
 // operation functions
@@ -107,45 +187,32 @@ void grippers_process_write_cmd(unsigned short int address,unsigned short int le
   }
 }
 
-// motion manager interface functions
 void grippers_process(void)
 {
-  uint16_t angle;
-
-  if(ram_data[DARWIN_GRIPPER_LEFT_ID]!=0xFF)
+  if(!are_joints_moving(1))
+  {
+    ram_data[DARWIN_GRIPPER_CNTRL]&=~GRIPPER_MOVING_LEFT;
+    if(gripper_left_target==0x01)
+      ram_data[DARWIN_GRIPPER_CNTRL]|=GRIPPER_OPENED_LEFT;
+    else
+      ram_data[DARWIN_GRIPPER_CNTRL]&=~GRIPPER_OPENED_LEFT;
+  }
+  else
   {
-    if(grippers_left_opened==0x01)
-    {
-      if(grippers_left_close==0x01)
-      {
-        grippers_left_close=0x00;
-        angle=ram_data[DARWIN_GRIPPER_LEFT_MIN_ANGLE_L]+(ram_data[DARWIN_GRIPPER_LEFT_MIN_ANGLE_H]<<8);
-        manager_current_angles[ram_data[DARWIN_GRIPPER_LEFT_ID]]=angle<<9;
-      }
-      else if(grippers_left_open==0x01)
-      {
-        grippers_left_open=0x00;
-        angle=ram_data[DARWIN_GRIPPER_LEFT_MAX_ANGLE_L]+(ram_data[DARWIN_GRIPPER_LEFT_MAX_ANGLE_H]<<8);
-        manager_current_angles[ram_data[DARWIN_GRIPPER_LEFT_ID]]=angle<<9;
-      }
-    }
+    ram_data[DARWIN_GRIPPER_CNTRL]&=~GRIPPER_OPENED_LEFT;
+    ram_data[DARWIN_GRIPPER_CNTRL]|=GRIPPER_MOVING_LEFT;
   }
-  if(ram_data[DARWIN_GRIPPER_RIGHT_ID]!=0xFF)
+  if(!are_joints_moving(2))
+  {
+    ram_data[DARWIN_GRIPPER_CNTRL]&=~GRIPPER_MOVING_RIGHT;
+    if(gripper_right_target==0x01)
+      ram_data[DARWIN_GRIPPER_CNTRL]|=GRIPPER_OPENED_RIGHT;
+    else
+      ram_data[DARWIN_GRIPPER_CNTRL]&=~GRIPPER_OPENED_RIGHT;
+  }
+  else
   {
-    if(grippers_right_opened==0x01)
-    {
-      if(grippers_right_close==0x01)
-      {
-        grippers_right_close=0x00;
-        angle=ram_data[DARWIN_GRIPPER_RIGHT_MIN_ANGLE_L]+(ram_data[DARWIN_GRIPPER_RIGHT_MIN_ANGLE_H]<<8);
-        manager_current_angles[ram_data[DARWIN_GRIPPER_RIGHT_ID]]=angle<<9;
-      }
-      else if(grippers_right_open==0x01)
-      {
-        grippers_right_open=0x00;
-        angle=ram_data[DARWIN_GRIPPER_RIGHT_MAX_ANGLE_L]+(ram_data[DARWIN_GRIPPER_RIGHT_MAX_ANGLE_H]<<8);
-        manager_current_angles[ram_data[DARWIN_GRIPPER_RIGHT_ID]]=angle<<9;
-      }
-    }
+    ram_data[DARWIN_GRIPPER_CNTRL]&=~GRIPPER_OPENED_RIGHT;
+    ram_data[DARWIN_GRIPPER_CNTRL]|=GRIPPER_MOVING_RIGHT;
   }
 }
diff --git a/src/motion_manager.c b/src/motion_manager.c
index b6bb218c0f2ca6f328eddaa2d5a5401b8bcd01d5..65f06bf2d20f20592bc365d76ab4193dcb766fa5 100755
--- a/src/motion_manager.c
+++ b/src/motion_manager.c
@@ -196,7 +196,7 @@ void MANAGER_TIMER_IRQHandler(void)
       head_tracking_process();
       // call the walking process
       walking_process();
-      // call the grippers process
+      // call the gripper process
       grippers_process();
       // balance the robot
       manager_balance(); 
diff --git a/src/ram.c b/src/ram.c
index e061c05b1e42cf5b5247a9c9b61043bc74410a6d..e708a462c3ed4c18b529f11d3f129342c2886ce2 100755
--- a/src/ram.c
+++ b/src/ram.c
@@ -119,8 +119,10 @@ void ram_init(void)
     ram_data[HEAD_TILT_I_CLAMP]=(uint8_t)(eeprom_data&0x00FF);
   if(EE_ReadVariable(HEAD_TILT_I_CLAMP+1,&eeprom_data)==0)
     ram_data[HEAD_TILT_I_CLAMP+1]=(uint8_t)(eeprom_data&0x00FF);
-  if(EE_ReadVariable(GRIPPER_LEFT_ID,&eeprom_data)==0)
-    ram_data[GRIPPER_LEFT_ID]=(uint8_t)(eeprom_data&0x00FF);
+  if(EE_ReadVariable(GRIPPER_LEFT_TOP_ID,&eeprom_data)==0)
+    ram_data[GRIPPER_LEFT_TOP_ID]=(uint8_t)(eeprom_data&0x00FF);
+  if(EE_ReadVariable(GRIPPER_LEFT_BOT_ID,&eeprom_data)==0)
+    ram_data[GRIPPER_LEFT_BOT_ID]=(uint8_t)(eeprom_data&0x00FF);
   if(EE_ReadVariable(GRIPPER_LEFT_MAX_ANGLE,&eeprom_data)==0)
     ram_data[GRIPPER_LEFT_MAX_ANGLE]=(uint8_t)(eeprom_data&0x00FF);
   if(EE_ReadVariable(GRIPPER_LEFT_MAX_ANGLE+1,&eeprom_data)==0)
@@ -133,8 +135,10 @@ void ram_init(void)
     ram_data[GRIPPER_LEFT_MAX_FORCE]=(uint8_t)(eeprom_data&0x00FF);
   if(EE_ReadVariable(GRIPPER_LEFT_MAX_FORCE+1,&eeprom_data)==0)
     ram_data[GRIPPER_LEFT_MAX_FORCE+1]=(uint8_t)(eeprom_data&0x00FF);
-  if(EE_ReadVariable(GRIPPER_RIGHT_ID,&eeprom_data)==0)
-    ram_data[GRIPPER_RIGHT_ID]=(uint8_t)(eeprom_data&0x00FF);
+  if(EE_ReadVariable(GRIPPER_RIGHT_TOP_ID,&eeprom_data)==0)
+    ram_data[GRIPPER_RIGHT_TOP_ID]=(uint8_t)(eeprom_data&0x00FF);
+  if(EE_ReadVariable(GRIPPER_RIGHT_BOT_ID,&eeprom_data)==0)
+    ram_data[GRIPPER_RIGHT_BOT_ID]=(uint8_t)(eeprom_data&0x00FF);
   if(EE_ReadVariable(GRIPPER_RIGHT_MAX_ANGLE,&eeprom_data)==0)
     ram_data[GRIPPER_RIGHT_MAX_ANGLE]=(uint8_t)(eeprom_data&0x00FF);
   if(EE_ReadVariable(GRIPPER_RIGHT_MAX_ANGLE+1,&eeprom_data)==0)