diff --git a/src/darwin_robot.cpp b/src/darwin_robot.cpp
index acdd3372954cbebbd15d176a2a72e061f4978ce6..2054b9c2669b67fcae313aed29a58b80de12a8b3 100644
--- a/src/darwin_robot.cpp
+++ b/src/darwin_robot.cpp
@@ -1962,6 +1962,256 @@ void CDarwinRobot::smart_charger_set_limit_current(double limit_current)
     throw CDarwinRobotException(_HERE_,"Invalid robot device");
 }
 
+/* grippers interface */
+void CDarwinRobot::gripper_set_max_angle(grippers_t gripper_id,double max_angle)
+{
+  unsigned short int value;
+
+  if(this->robot_device!=NULL)
+  {
+    value=max_angle*128.0;
+    if(gripper_id==LEFT_GRIPPER)
+      this->robot_device->write_word_register(DARWIN_GRIPPER_LEFT_MAX_ANGLE_L,value);
+    else
+      this->robot_device->write_word_register(DARWIN_GRIPPER_RIGHT_MAX_ANGLE_L,value);
+    usleep(100000);
+  }
+  else
+    throw CDarwinRobotException(_HERE_,"Invalid robot device");
+}
+
+double CDarwinRobot::gripper_get_max_angle(grippers_t gripper_id)
+{
+  unsigned short int value;
+
+  if(this->robot_device!=NULL)
+  {
+    if(gripper_id==LEFT_GRIPPER)
+      this->robot_device->read_word_register(DARWIN_GRIPPER_LEFT_MAX_ANGLE_L,&value);
+    else
+      this->robot_device->read_word_register(DARWIN_GRIPPER_RIGHT_MAX_ANGLE_L,&value);
+    return ((double)value)/128.0;
+  }
+  else
+    throw CDarwinRobotException(_HERE_,"Invalid robot device");
+}
+
+void CDarwinRobot::gripper_set_min_angle(grippers_t gripper_id,double min_angle)
+{
+  unsigned short int value;
+
+  if(this->robot_device!=NULL)
+  {
+    value=min_angle*128.0;
+    if(gripper_id==LEFT_GRIPPER)
+      this->robot_device->write_word_register(DARWIN_GRIPPER_LEFT_MIN_ANGLE_L,value);
+    else
+      this->robot_device->write_word_register(DARWIN_GRIPPER_RIGHT_MAX_ANGLE_L,value);
+    usleep(100000);
+  }
+  else
+    throw CDarwinRobotException(_HERE_,"Invalid robot device");
+}
+
+double CDarwinRobot::gripper_get_min_angle(grippers_t gripper_id)
+{
+  unsigned short int value;
+
+  if(this->robot_device!=NULL)
+  {
+    if(gripper_id==LEFT_GRIPPER)
+      this->robot_device->read_word_register(DARWIN_GRIPPER_LEFT_MIN_ANGLE_L,&value);
+    else
+      this->robot_device->read_word_register(DARWIN_GRIPPER_RIGHT_MIN_ANGLE_L,&value);
+    return ((double)value)/128.0;
+  }
+  else
+    throw CDarwinRobotException(_HERE_,"Invalid robot device");
+}
+
+void CDarwinRobot::gripper_set_max_force(grippers_t gripper_id,unsigned short int max_force)
+{
+  if(this->robot_device!=NULL)
+  {
+    if(max_force>1024)
+      max_force=1024;
+    if(gripper_id==LEFT_GRIPPER)
+      this->robot_device->write_word_register(DARWIN_GRIPPER_LEFT_MAX_FORCE_L,max_force);
+    else
+      this->robot_device->write_word_register(DARWIN_GRIPPER_RIGHT_MAX_FORCE_L,max_force);
+    usleep(100000);
+  }
+  else
+    throw CDarwinRobotException(_HERE_,"Invalid robot device");
+}
+
+unsigned short int CDarwinRobot::gripper_get_max_force(grippers_t gripper_id)
+{
+  unsigned short int value;
+
+  if(this->robot_device!=NULL)
+  {
+    if(gripper_id==LEFT_GRIPPER)
+      this->robot_device->read_word_register(DARWIN_GRIPPER_LEFT_MAX_FORCE_L,&value);
+    else
+      this->robot_device->read_word_register(DARWIN_GRIPPER_RIGHT_MAX_FORCE_L,&value);
+    return value;
+  }
+  else
+    throw CDarwinRobotException(_HERE_,"Invalid robot device");
+}
+
+void CDarwinRobot::gripper_set_servo_ids(grippers_t gripper_id, unsigned char top_id, unsigned char bot_id)
+{
+  if(this->robot_device!=NULL)
+  {
+    if(gripper_id==LEFT_GRIPPER)
+    {
+      this->robot_device->write_byte_register(DARWIN_GRIPPER_LEFT_TOP_ID,top_id);
+      usleep(100000);
+      this->robot_device->write_byte_register(DARWIN_GRIPPER_LEFT_BOT_ID,bot_id);
+      usleep(100000);
+    }
+    else
+    {
+      this->robot_device->write_byte_register(DARWIN_GRIPPER_RIGHT_TOP_ID,top_id);
+      usleep(100000);
+      this->robot_device->write_byte_register(DARWIN_GRIPPER_RIGHT_BOT_ID,bot_id);
+      usleep(100000);
+    }
+  }
+  else
+    throw CDarwinRobotException(_HERE_,"Invalid robot device");
+}
+
+void CDarwinRobot::gripper_get_servo_ids(grippers_t gripper_id, unsigned char *top_id, unsigned char *bot_id)
+{
+  unsigned short int value;
+
+  if(this->robot_device!=NULL)
+  {
+    if(gripper_id==LEFT_GRIPPER)
+    {
+      this->robot_device->read_byte_register(DARWIN_GRIPPER_LEFT_TOP_ID,top_id);
+      this->robot_device->read_byte_register(DARWIN_GRIPPER_LEFT_BOT_ID,bot_id);
+    }
+    else
+    {
+      this->robot_device->read_byte_register(DARWIN_GRIPPER_RIGHT_TOP_ID,top_id);
+      this->robot_device->read_byte_register(DARWIN_GRIPPER_RIGHT_BOT_ID,bot_id);
+    }
+  }
+  else
+    throw CDarwinRobotException(_HERE_,"Invalid robot device");
+}
+
+void CDarwinRobot::gripper_open(grippers_t gripper_id)
+{
+  if(this->robot_device!=NULL)
+  {
+    if(gripper_id==LEFT_GRIPPER)
+      this->robot_device->write_byte_register(DARWIN_GRIPPER_CNTRL,0x04);
+    else
+      this->robot_device->write_byte_register(DARWIN_GRIPPER_CNTRL,0x01);
+  }
+  else
+    throw CDarwinRobotException(_HERE_,"Invalid robot device");
+}
+
+void CDarwinRobot::gripper_close(grippers_t gripper_id)
+{
+  if(this->robot_device!=NULL)
+  {
+    if(gripper_id==LEFT_GRIPPER)
+      this->robot_device->write_byte_register(DARWIN_GRIPPER_CNTRL,0x08);
+    else
+      this->robot_device->write_byte_register(DARWIN_GRIPPER_CNTRL,0x02);
+  }
+  else
+    throw CDarwinRobotException(_HERE_,"Invalid robot device");
+}
+
+bool CDarwinRobot::gripper_is_moving(grippers_t gripper_id)
+{
+  unsigned char status;
+
+  if(this->robot_device!=NULL)
+  {
+    if(gripper_id==LEFT_GRIPPER)
+    {
+      this->robot_device->read_byte_register(DARWIN_GRIPPER_CNTRL,&status);
+      if(status&GRIPPER_MOVING_LEFT)
+        return true;
+      else
+        return false;
+    }
+    else
+    {
+      this->robot_device->read_byte_register(DARWIN_GRIPPER_CNTRL,&status);
+      if(status&GRIPPER_MOVING_RIGHT)
+        return true;
+      else
+        return false;
+    }
+  }
+  else
+    throw CDarwinRobotException(_HERE_,"Invalid robot device");
+}
+
+bool CDarwinRobot::gripper_is_open(grippers_t gripper_id)
+{
+  unsigned char status;
+
+  if(this->robot_device!=NULL)
+  {
+    if(gripper_id==LEFT_GRIPPER)
+    {
+      this->robot_device->read_byte_register(DARWIN_GRIPPER_CNTRL,&status);
+      if(status&GRIPPER_OPENED_LEFT)
+        return true;
+      else
+        return false;
+    }
+    else
+    {
+      this->robot_device->read_byte_register(DARWIN_GRIPPER_CNTRL,&status);
+      if(status&GRIPPER_OPENED_RIGHT)
+        return true;
+      else
+        return false;
+    }
+  }
+  else
+    throw CDarwinRobotException(_HERE_,"Invalid robot device");
+}
+
+bool CDarwinRobot::gripper_is_close(grippers_t gripper_id)
+{
+  unsigned char status;
+
+  if(this->robot_device!=NULL)
+  {
+    if(gripper_id==LEFT_GRIPPER)
+    {
+      this->robot_device->read_byte_register(DARWIN_GRIPPER_CNTRL,&status);
+      if(status&GRIPPER_OPENED_LEFT)
+        return false;
+      else
+        return true;
+    }
+    else
+    {
+      this->robot_device->read_byte_register(DARWIN_GRIPPER_CNTRL,&status);
+      if(status&GRIPPER_OPENED_RIGHT)
+        return false;
+      else
+        return true;
+    }
+  }
+  else
+    throw CDarwinRobotException(_HERE_,"Invalid robot device");
+}
+
 CDarwinRobot::~CDarwinRobot()
 {
   if(this->robot_device!=NULL)
diff --git a/src/darwin_robot.h b/src/darwin_robot.h
index 45a925dd0e7989a557085513479fe6749db0888c..acda926c0e29ee2168e577bc1426c78ad2210d5a 100644
--- a/src/darwin_robot.h
+++ b/src/darwin_robot.h
@@ -203,53 +203,67 @@ class CDarwinRobot
     void head_get_current_target(double *pan,double *tilt);
     
     // smart charger interface
- /** 
-  * \brief Function to check if smart charger module is detected
-  */
+    /** 
+     * \brief Function to check if smart charger module is detected
+     */
     bool is_smart_charger_detected(void);
- /**
-  * \brief Function to check if smart charger module is enabled
-  */
+    /**
+     * \brief Function to check if smart charger module is enabled
+     */
     bool is_smart_charger_enabled(void);
-/**
- * \brief Function to enable smart charger module
- */
+    /**
+     * \brief Function to enable smart charger module
+     */
     void smart_charger_enable(void);
- /**
- * \brief Function to disable smart charger module
- */
+    /**
+     * \brief Function to disable smart charger module
+     */
     void smart_charger_disable(void);
- /**
- * \brief Function to set smart charger's read operation period
- * \param period Period in s of smart charger module
- */
+    /**
+     * \brief Function to set smart charger's read operation period
+     * \param period Period in s of smart charger module
+     */
     void smart_charger_set_period(double period);
- /**
- * \brief Function to get smart charger's read operation period in segs
- */
+    /**
+     * \brief Function to get smart charger's read operation period in segs
+     */
     double smart_charger_get_period(void);
-/**
- * \brief Function to get smart charger's data: Battery average time to empty and to full and battery status
- * 
- * Battery status: indicates whether if AC and/or battery are connected or not
- * Avg time to full
- * Avg time to empty
- */
+    /**
+     * \brief Function to get smart charger's data: Battery average time to empty and to full and battery status
+     * 
+     * Battery status: indicates whether if AC and/or battery are connected or not
+     * Avg time to full
+     * Avg time to empty
+     */
     TChargerData smart_charger_get_data(void);
- /**
-  * 
-  */
+    /**
+     * 
+     */
     void smart_charger_set_range_current(double min_current, double max_current);
- /**
-  * \brief Function to get limit current in A
-  */
+    /**
+     * \brief Function to get limit current in A
+     */
     double smart_charger_get_limit_current(void);
     /**
- * \brief Function to set smart charger's limit current
- * \param limit_current Value of limit current in A
- */
+     * \brief Function to set smart charger's limit current
+     * \param limit_current Value of limit current in A
+    */
     void smart_charger_set_limit_current(double limit_current);
    
+    /* grippers interface */
+    void gripper_set_max_angle(grippers_t gripper_id,double max_angle);
+    double gripper_get_max_angle(grippers_t gripper_id);
+    void gripper_set_min_angle(grippers_t gripper_id,double min_angle);
+    double gripper_get_min_angle(grippers_t gripper_id);
+    void gripper_set_max_force(grippers_t gripper_id,unsigned short int max_force);
+    unsigned short int gripper_get_max_force(grippers_t gripper_id);
+    void gripper_set_servo_ids(grippers_t gripper_id, unsigned char top_id, unsigned char bot_id);
+    void gripper_get_servo_ids(grippers_t gripper_id, unsigned char *top_id, unsigned char *bot_id);
+    void gripper_open(grippers_t gripper_id);
+    void gripper_close(grippers_t gripper_id);
+    bool gripper_is_moving(grippers_t gripper_id);
+    bool gripper_is_open(grippers_t gripper_id);
+    bool gripper_is_close(grippers_t gripper_id);
     ~CDarwinRobot();
 };