diff --git a/include/darwin_registers.h b/include/darwin_registers.h
index 6cf97e222fddecd38a478dbd4298510851220d53..4a4684dc1914b1261ea7efe4eaa48a3c02c03cda 100644
--- a/include/darwin_registers.h
+++ b/include/darwin_registers.h
@@ -86,6 +86,24 @@ extern "C" {
 #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 STAIRS_PHASE1_TIME              ((unsigned short int)0x0066)
+#define STAIRS_PHASE2_TIME              ((unsigned short int)0x0068)
+#define STAIRS_PHASE3_TIME              ((unsigned short int)0x006A)
+#define STAIRS_PHASE4_TIME              ((unsigned short int)0x006C)
+#define STAIRS_PHASE5_TIME              ((unsigned short int)0x006E)
+#define STAIRS_PHASE6_TIME              ((unsigned short int)0x0070)
+#define STAIRS_PHASE7_TIME              ((unsigned short int)0x0072)
+#define STAIRS_PHASE8_TIME              ((unsigned short int)0x0074)
+#define STAIRS_PHASE9_TIME              ((unsigned short int)0x0076)
+#define STAIRS_X_OFFSET                 ((unsigned short int)0x0078)
+#define STAIRS_Y_OFFSET                 ((unsigned short int)0x0079)
+#define STAIRS_Z_OFFSET                 ((unsigned short int)0x007A)
+#define STAIRS_Y_SHIFT                  ((unsigned short int)0x007B)
+#define STAIRS_X_LEFT_SHIFT             ((unsigned short int)0x007C)
+#define STAIRS_X_RIGHT_SHIFT            ((unsigned short int)0x007D)
+#define STAIRS_Z_OVERSHOOT              ((unsigned short int)0x007E)
+#define STAIRS_Z_HEIGHT                 ((unsigned short int)0x007F)
+#define STAIRS_HIP_PITCH_OFF            ((unsigned short int)0x0080)
 
 #define LAST_EEPROM_OFFSET              ((unsigned short int)0x00FF)
 
@@ -192,6 +210,34 @@ typedef enum {
   DARWIN_GRIPPER_RIGHT_MAX_FORCE_H     = GRIPPER_RIGHT_MAX_FORCE+1,
   DARWIN_SMART_CHARGER_PERIOD_L        = SMART_CHARGER_PERIOD, //en ms
   DARWIN_SMART_CHARGER_PERIOD_H        = SMART_CHARGER_PERIOD+1,
+  DARWIN_STAIRS_PHASE1_TIME_L          = STAIRS_PHASE1_TIME,
+  DARWIN_STAIRS_PHASE1_TIME_H          = STAIRS_PHASE1_TIME+1,
+  DARWIN_STAIRS_PHASE2_TIME_L          = STAIRS_PHASE2_TIME,  
+  DARWIN_STAIRS_PHASE2_TIME_H          = STAIRS_PHASE2_TIME+1,  
+  DARWIN_STAIRS_PHASE3_TIME_L          = STAIRS_PHASE3_TIME,
+  DARWIN_STAIRS_PHASE3_TIME_H          = STAIRS_PHASE3_TIME+1,
+  DARWIN_STAIRS_PHASE4_TIME_L          = STAIRS_PHASE4_TIME,
+  DARWIN_STAIRS_PHASE4_TIME_H          = STAIRS_PHASE4_TIME+1,
+  DARWIN_STAIRS_PHASE5_TIME_L          = STAIRS_PHASE5_TIME,
+  DARWIN_STAIRS_PHASE5_TIME_H          = STAIRS_PHASE5_TIME+1,
+  DARWIN_STAIRS_PHASE6_TIME_L          = STAIRS_PHASE6_TIME,
+  DARWIN_STAIRS_PHASE6_TIME_H          = STAIRS_PHASE6_TIME+1,
+  DARWIN_STAIRS_PHASE7_TIME_L          = STAIRS_PHASE7_TIME,
+  DARWIN_STAIRS_PHASE7_TIME_H          = STAIRS_PHASE7_TIME+1,
+  DARWIN_STAIRS_PHASE8_TIME_L          = STAIRS_PHASE8_TIME,
+  DARWIN_STAIRS_PHASE8_TIME_H          = STAIRS_PHASE8_TIME+1,
+  DARWIN_STAIRS_PHASE9_TIME_L          = STAIRS_PHASE9_TIME,
+  DARWIN_STAIRS_PHASE9_TIME_H          = STAIRS_PHASE9_TIME+1,
+  DARWIN_STAIRS_X_OFFSET               = STAIRS_X_OFFSET, 
+  DARWIN_STAIRS_Y_OFFSET               = STAIRS_Y_OFFSET,
+  DARWIN_STAIRS_Z_OFFSET               = STAIRS_Z_OFFSET,
+  DARWIN_STAIRS_Y_SHIFT                = STAIRS_Y_SHIFT,
+  DARWIN_STAIRS_X_LEFT_SHIFT           = STAIRS_X_LEFT_SHIFT,
+  DARWIN_STAIRS_X_RIGHT_SHIFT          = STAIRS_X_RIGHT_SHIFT,
+  DARWIN_STAIRS_Z_OVERSHOOT            = STAIRS_Z_OVERSHOOT,
+  DARWIN_STAIRS_Z_HEIGHT               = STAIRS_Z_HEIGHT,
+  DARWIN_STAIRS_HIP_PITCH_OFF          = STAIRS_HIP_PITCH_OFF,
+
 //RAM  
   DARWIN_TX_LED_CNTRL              = 0x0100, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2  | bit 1 |      bit 0
                                              //       |       |       |       | blink | toggle | value | internally used
@@ -582,6 +628,8 @@ typedef enum {
                                                    //                                               |  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 | left moving | right moving | close left | open left  | close right | open right 
+  DARWIN_STAIRS_CNTRL                    = 0x0252, // bit 7 | bit 6 | bit 5 |   bit 4  | bit 3 | bit 2 |     bit 1    |    bit 0
+                                                   // current phase         | climbing |       |       | stop stairs  | start stairs
 }darwin_registers;
 
 #define      GPIO_BASE_ADDRESS       0x0100
diff --git a/include/eeprom_init.h b/include/eeprom_init.h
index cb4543cfe461d97c1d856b49320e3b7af92296b1..570db02afd4ab008e6a766371ad177ebeea762c1 100644
--- a/include/eeprom_init.h
+++ b/include/eeprom_init.h
@@ -83,9 +83,25 @@ extern "C" {
 #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      0x0080 // 1023 max force in binary format
-#define    DEFAULT_SMART_CHARGER_PERIOD         0x05DC //1500 ms 
-
-  
+#define    DEFAULT_SMART_CHARGER_PERIOD         0x05DC // 1500 ms 
+#define    DEFAULT_STAIRS_PHASE1_TIME           0x0064 // 100 ms 
+#define    DEFAULT_STAIRS_PHASE2_TIME           0x00C8 // 200 ms   
+#define    DEFAULT_STAIRS_PHASE3_TIME           0x012C // 300 ms
+#define    DEFAULT_STAIRS_PHASE4_TIME           0x0190 // 400 ms
+#define    DEFAULT_STAIRS_PHASE5_TIME           0x01F4 // 500 ms
+#define    DEFAULT_STAIRS_PHASE6_TIME           0x0258 // 600 ms
+#define    DEFAULT_STAIRS_PHASE7_TIME           0x02BC // 700 ms
+#define    DEFAULT_STAIRS_PHASE8_TIME           0x0320 // 800 ms
+#define    DEFAULT_STAIRS_PHASE9_TIME           0x0384 // 900 ms
+#define    DEFAULT_STAIRS_X_OFFSET              0xFFF6 // -10 mm
+#define    DEFAULT_STAIRS_Y_OFFSET              0x0005 // 5mm
+#define    DEFAULT_STAIRS_Z_OFFSET              0x0014 // 20 mm
+#define    DEFAULT_STAIRS_Y_SHIFT               0x0014 // 20 mm
+#define    DEFAULT_STAIRS_X_LEFT_SHIFT          0x000A // 10 mm
+#define    DEFAULT_STAIRS_X_RIGHT_SHIFT         0x0032 // 50 mm
+#define    DEFAULT_STAIRS_Z_OVERSHOOT           0x000A // 10 mm
+#define    DEFAULT_STAIRS_Z_HEIGHT              0x001E // 30 mm
+#define    DEFAULT_STAIRS_HIP_PITCH_OFF         0x34B6 // 13.18 degrees in fixed point format 6 (1+5) | 10
 
 #ifdef __cplusplus
 }
diff --git a/include/stairs.h b/include/stairs.h
new file mode 100755
index 0000000000000000000000000000000000000000..6907e9f84876b91ea893becb4aee8d634029c03b
--- /dev/null
+++ b/include/stairs.h
@@ -0,0 +1,30 @@
+#ifndef _STAIRS_H
+#define _STAIRS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "stm32f1xx.h"
+#include "motion_manager.h"
+
+// public functions
+void stairs_init(uint16_t period_us);
+inline void stairs_set_period(uint16_t period_us);
+inline uint16_t stairs_get_period(void);
+void stairs_start(void);
+void stairs_stop(void);
+uint8_t is_climbing_stairs(void);
+
+// operation functions
+uint8_t stairs_in_range(unsigned short int address, unsigned short int length);
+void stairs_process_read_cmd(unsigned short int address,unsigned short int length,unsigned char *data);
+void stairs_process_write_cmd(unsigned short int address,unsigned short int length,unsigned char *data);
+// motion manager interface functions
+void stairs_process(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/eeprom.c b/src/eeprom.c
index fbb5a1a8caf6dd6e796739c795ad05376e2c41d6..b6eae9e83e835b5ff1e12a59a73c6c80467f28b8 100755
--- a/src/eeprom.c
+++ b/src/eeprom.c
@@ -156,7 +156,34 @@ uint16_t eeprom_data[] __attribute__ ((section (".eeprom")))={VALID_PAGE,
                                                               DEFAULT_GRIPPER_RIGHT_MAX_FORCE&0xFF,      GRIPPER_RIGHT_MAX_FORCE,
                                                               DEFAULT_GRIPPER_RIGHT_MAX_FORCE>>8,        GRIPPER_RIGHT_MAX_FORCE+1,        
                                                               DEFAULT_SMART_CHARGER_PERIOD&0xFF,         SMART_CHARGER_PERIOD,
-                                                              DEFAULT_SMART_CHARGER_PERIOD>>8,           SMART_CHARGER_PERIOD+1};
+                                                              DEFAULT_SMART_CHARGER_PERIOD>>8,           SMART_CHARGER_PERIOD+1,
+                                                              DEFAULT_STAIRS_PHASE1_TIME&0xFF,           STAIRS_PHASE1_TIME,
+                                                              DEFAULT_STAIRS_PHASE1_TIME>>8,             STAIRS_PHASE1_TIME+1,
+                                                              DEFAULT_STAIRS_PHASE2_TIME&0xFF,           STAIRS_PHASE2_TIME,
+                                                              DEFAULT_STAIRS_PHASE2_TIME>>8,             STAIRS_PHASE2_TIME+1,
+                                                              DEFAULT_STAIRS_PHASE3_TIME&0xFF,           STAIRS_PHASE3_TIME,
+                                                              DEFAULT_STAIRS_PHASE3_TIME>>8,             STAIRS_PHASE3_TIME+1,
+                                                              DEFAULT_STAIRS_PHASE4_TIME&0xFF,           STAIRS_PHASE4_TIME,
+                                                              DEFAULT_STAIRS_PHASE4_TIME>>8,             STAIRS_PHASE4_TIME+1,
+                                                              DEFAULT_STAIRS_PHASE5_TIME&0xFF,           STAIRS_PHASE5_TIME,
+                                                              DEFAULT_STAIRS_PHASE5_TIME>>8,             STAIRS_PHASE5_TIME+1,
+                                                              DEFAULT_STAIRS_PHASE6_TIME&0xFF,           STAIRS_PHASE6_TIME,
+                                                              DEFAULT_STAIRS_PHASE6_TIME>>8,             STAIRS_PHASE6_TIME+1,
+                                                              DEFAULT_STAIRS_PHASE7_TIME&0xFF,           STAIRS_PHASE7_TIME,
+                                                              DEFAULT_STAIRS_PHASE7_TIME>>8,             STAIRS_PHASE7_TIME+1,
+                                                              DEFAULT_STAIRS_PHASE8_TIME&0xFF,           STAIRS_PHASE8_TIME,
+                                                              DEFAULT_STAIRS_PHASE8_TIME>>8,             STAIRS_PHASE8_TIME+1,
+                                                              DEFAULT_STAIRS_PHASE9_TIME&0xFF,           STAIRS_PHASE9_TIME,
+                                                              DEFAULT_STAIRS_PHASE9_TIME>>8,             STAIRS_PHASE9_TIME+1,
+                                                              DEFAULT_STAIRS_X_OFFSET,                   STAIRS_X_OFFSET,
+                                                              DEFAULT_STAIRS_Y_OFFSET,                   STAIRS_Y_OFFSET,
+                                                              DEFAULT_STAIRS_Z_OFFSET,                   STAIRS_Z_OFFSET,
+                                                              DEFAULT_STAIRS_Y_SHIFT,                    STAIRS_Y_SHIFT,
+                                                              DEFAULT_STAIRS_X_LEFT_SHIFT,               STAIRS_X_LEFT_SHIFT,
+                                                              DEFAULT_STAIRS_X_RIGHT_SHIFT,              STAIRS_X_RIGHT_SHIFT,
+                                                              DEFAULT_STAIRS_Z_OVERSHOOT,                STAIRS_Z_OVERSHOOT, 
+                                                              DEFAULT_STAIRS_Z_HEIGHT,                   STAIRS_Z_HEIGHT,
+                                                              DEFAULT_STAIRS_HIP_PITCH_OFF,              STAIRS_HIP_PITCH_OFF};
 
 /* Private function prototypes -----------------------------------------------*/
 /* Private functions ---------------------------------------------------------*/
diff --git a/src/stairs.c b/src/stairs.c
new file mode 100755
index 0000000000000000000000000000000000000000..dfa470a0c52633f67eeb64c0107b3f26312f7cdf
--- /dev/null
+++ b/src/stairs.c
@@ -0,0 +1,339 @@
+#include "stairs.h"
+#include "darwin_kinematics.h"
+#include "darwin_math.h"
+#include "ram.h"
+#include <math.h>
+
+typedef enum {SHIFT_WEIGHT_LEFT,RISE_RIGHT_FOOT,ADVANCE_RIGHT_FOOT,CONTACT_RIGHT_FOOT,SHIFT_WEIGHT_RIGHT,RISE_LEFT_FOOT,ADVANCE_LEFT_FOOT,CONTACT_LEFT_FOOT,CENTER_WEIGHT} stairs_phase_t;
+
+// internal motion variables
+float m_Z_stair_height;
+float m_Z_overshoot;
+float m_Y_swap_amplitude;
+float m_X_left_swap_amplitude;
+float m_Y_right_swap_amplitude;
+
+// internal offset variables
+float m_Hip_Pitch_Offset;
+float m_X_Offset;
+float m_Y_Offset;
+float m_Z_Offset;
+
+// internal time variables
+float m_Time;
+float m_stairs_period;
+float m_shift_weight_left_time;
+float m_rise_right_foot_time;
+float advance_right_foot_time;
+float contact_right_foot_time;
+float shift_weight_right_time;
+float rise_left_foot_time;
+float advance_left_foot_time;
+float contact_left_foot_time;
+float center_weight_time;
+float total_time;
+
+// control variables
+uint8_t m_Ctrl_Running;
+
+// private functions
+
+// public functions
+void stairs_init(uint16_t period_us)
+{
+  // initialize the internal motion variables
+
+
+  // initialize internal control variables
+  m_Time=0;
+  stairs_period=((float)period_us)/1000.0;
+  m_Ctrl_Running=0x00;
+
+  stairs_process();
+}
+
+inline void stairs_set_period(uint16_t period_us)
+{
+  stairs_period=((float)period_us)/1000.0;
+}
+
+inline uint16_t stairs_get_period(void)
+{
+  return (uint16_t)(stairs_period*1000);
+}
+
+void stairs_start(void)
+{
+  ram_data[DARWIN_WALK_CNTRL]|=WALK_STATUS;
+  m_Ctrl_Running=0x01;
+}
+
+void stairs_stop(void)
+{
+  m_Ctrl_Running=0x00;
+}
+
+uint8_t is_climbing_stairs(void)
+{
+  if(ram_data[DARWIN_WALK_CNTRL]&WALK_STATUS)
+    return 0x01;
+  else 
+    return 0x00;
+}
+
+// motion manager interface functions
+void stairs_process(void)
+{
+  float x_swap,y_swap,z_swap,a_swap,b_swap,c_swap;
+  float x_move_r,y_move_r,z_move_r,a_move_r,b_move_r,c_move_r;
+  float x_move_l,y_move_l,z_move_l,a_move_l,b_move_l,c_move_l;
+  float pelvis_offset_r,pelvis_offset_l;
+//  float m_Body_Swing_Y,m_Body_Swing_Z;
+  float angle[14],ep[12];
+
+  if(m_Time==0)
+  {
+    update_param_time();
+    ram_data[DARWIN_WALK_CNTRL]&=(~WALK_PHASE);
+    ram_data[DARWIN_WALK_CNTRL]|=PHASE0;
+    if(m_Ctrl_Running==0x00)
+    {
+      if(m_X_Move_Amplitude==0 && m_Y_Move_Amplitude==0 && m_A_Move_Amplitude==0)
+        ram_data[DARWIN_WALK_CNTRL]&=(~WALK_STATUS);
+      else
+      {
+        ram_data[DARWIN_WALK_STEP_FW_BW]=0.0;
+        ram_data[DARWIN_WALK_STEP_LEFT_RIGHT]=0.0;
+        ram_data[DARWIN_WALK_STEP_DIRECTION]=0.0;
+      }
+    }
+  }
+  else if(m_Time>=(m_Phase_Time1-stairs_period/2.0) && m_Time<(m_Phase_Time1+stairs_period/2.0))
+  {
+    update_param_move();
+    ram_data[DARWIN_WALK_CNTRL]&=(~WALK_PHASE);
+    ram_data[DARWIN_WALK_CNTRL]|=PHASE1;
+  }
+  else if(m_Time>=(m_Phase_Time2-stairs_period/2.0) && m_Time<(m_Phase_Time2+stairs_period/2.0))
+  {
+    update_param_time();
+    m_Time=m_Phase_Time2;
+    ram_data[DARWIN_WALK_CNTRL]&=(~WALK_PHASE);
+    ram_data[DARWIN_WALK_CNTRL]|=PHASE2;
+    if(m_Ctrl_Running==0x00)
+    {
+      if(m_X_Move_Amplitude==0 && m_Y_Move_Amplitude==0 && m_A_Move_Amplitude==0)
+        ram_data[DARWIN_WALK_CNTRL]&=~WALK_STATUS;
+      else
+      {
+        ram_data[DARWIN_WALK_STEP_FW_BW]=0.0;
+        ram_data[DARWIN_WALK_STEP_LEFT_RIGHT]=0.0;
+        ram_data[DARWIN_WALK_STEP_DIRECTION]=0.0;
+      }
+    }
+  }
+  else if(m_Time>=(m_Phase_Time3-stairs_period/2.0) && m_Time<(m_Phase_Time3+stairs_period/2.0))
+  {
+    update_param_move();
+    ram_data[DARWIN_WALK_CNTRL]&=(~WALK_PHASE);
+    ram_data[DARWIN_WALK_CNTRL]|=PHASE3;
+  }
+  update_param_balance();
+
+  // Compute endpoints
+  x_swap=wsin(m_Time,m_X_Swap_PeriodTime,m_X_Swap_Phase_Shift,m_X_Swap_Amplitude,m_X_Swap_Amplitude_Shift);
+  y_swap=wsin(m_Time,m_Y_Swap_PeriodTime,m_Y_Swap_Phase_Shift,m_Y_Swap_Amplitude,m_Y_Swap_Amplitude_Shift);
+  z_swap=wsin(m_Time,m_Z_Swap_PeriodTime,m_Z_Swap_Phase_Shift,m_Z_Swap_Amplitude,m_Z_Swap_Amplitude_Shift);
+  a_swap=0;
+  b_swap=0;
+  c_swap=0;
+  if(m_Time<=m_SSP_Time_Start_L)
+  {
+    x_move_l=wsin(m_SSP_Time_Start_L,m_X_Move_PeriodTime,m_X_Move_Phase_Shift+2.0*PI/m_X_Move_PeriodTime*m_SSP_Time_Start_L,m_X_Move_Amplitude,m_X_Move_Amplitude_Shift);
+    y_move_l=wsin(m_SSP_Time_Start_L,m_Y_Move_PeriodTime,m_Y_Move_Phase_Shift+2.0*PI/m_Y_Move_PeriodTime*m_SSP_Time_Start_L,m_Y_Move_Amplitude,m_Y_Move_Amplitude_Shift);
+    z_move_l=wsin(m_SSP_Time_Start_L,m_Z_Move_PeriodTime,m_Z_Move_Phase_Shift+2.0*PI/m_Z_Move_PeriodTime*m_SSP_Time_Start_L,m_Z_Move_Amplitude,m_Z_Move_Amplitude_Shift);
+    c_move_l=wsin(m_SSP_Time_Start_L,m_A_Move_PeriodTime,m_A_Move_Phase_Shift+2.0*PI/m_A_Move_PeriodTime*m_SSP_Time_Start_L,m_A_Move_Amplitude,m_A_Move_Amplitude_Shift);
+    x_move_r=wsin(m_SSP_Time_Start_L,m_X_Move_PeriodTime,m_X_Move_Phase_Shift+2.0*PI/m_X_Move_PeriodTime*m_SSP_Time_Start_L,-m_X_Move_Amplitude,-m_X_Move_Amplitude_Shift);
+    y_move_r=wsin(m_SSP_Time_Start_L,m_Y_Move_PeriodTime,m_Y_Move_Phase_Shift+2.0*PI/m_Y_Move_PeriodTime*m_SSP_Time_Start_L,-m_Y_Move_Amplitude,-m_Y_Move_Amplitude_Shift);
+    z_move_r=wsin(m_SSP_Time_Start_R,m_Z_Move_PeriodTime,m_Z_Move_Phase_Shift+2.0*PI/m_Z_Move_PeriodTime*m_SSP_Time_Start_R,m_Z_Move_Amplitude,m_Z_Move_Amplitude_Shift);
+    c_move_r=wsin(m_SSP_Time_Start_L,m_A_Move_PeriodTime,m_A_Move_Phase_Shift+2.0*PI/m_A_Move_PeriodTime*m_SSP_Time_Start_L,-m_A_Move_Amplitude,-m_A_Move_Amplitude_Shift);
+    pelvis_offset_l=0;
+    pelvis_offset_r=0;
+  }
+  else if(m_Time<=m_SSP_Time_End_L)
+  {
+    x_move_l=wsin(m_Time,m_X_Move_PeriodTime,m_X_Move_Phase_Shift+2.0*PI/m_X_Move_PeriodTime*m_SSP_Time_Start_L,m_X_Move_Amplitude,m_X_Move_Amplitude_Shift);
+    y_move_l=wsin(m_Time,m_Y_Move_PeriodTime,m_Y_Move_Phase_Shift+2.0*PI/m_Y_Move_PeriodTime*m_SSP_Time_Start_L,m_Y_Move_Amplitude,m_Y_Move_Amplitude_Shift);
+    z_move_l=wsin(m_Time,m_Z_Move_PeriodTime,m_Z_Move_Phase_Shift+2.0*PI/m_Z_Move_PeriodTime*m_SSP_Time_Start_L,m_Z_Move_Amplitude,m_Z_Move_Amplitude_Shift);
+    c_move_l=wsin(m_Time,m_A_Move_PeriodTime,m_A_Move_Phase_Shift+2.0*PI/m_A_Move_PeriodTime*m_SSP_Time_Start_L,m_A_Move_Amplitude,m_A_Move_Amplitude_Shift);
+    x_move_r=wsin(m_Time,m_X_Move_PeriodTime,m_X_Move_Phase_Shift+2.0*PI/m_X_Move_PeriodTime*m_SSP_Time_Start_L,-m_X_Move_Amplitude,-m_X_Move_Amplitude_Shift);
+    y_move_r=wsin(m_Time,m_Y_Move_PeriodTime,m_Y_Move_Phase_Shift+2.0*PI/m_Y_Move_PeriodTime*m_SSP_Time_Start_L,-m_Y_Move_Amplitude,-m_Y_Move_Amplitude_Shift);
+    z_move_r=wsin(m_SSP_Time_Start_R,m_Z_Move_PeriodTime,m_Z_Move_Phase_Shift+2.0*PI/m_Z_Move_PeriodTime*m_SSP_Time_Start_R,m_Z_Move_Amplitude,m_Z_Move_Amplitude_Shift);
+    c_move_r=wsin(m_Time,m_A_Move_PeriodTime,m_A_Move_Phase_Shift+2.0*PI/m_A_Move_PeriodTime*m_SSP_Time_Start_L,-m_A_Move_Amplitude,-m_A_Move_Amplitude_Shift);
+    pelvis_offset_l=wsin(m_Time,m_Z_Move_PeriodTime,m_Z_Move_Phase_Shift+2.0*PI/m_Z_Move_PeriodTime*m_SSP_Time_Start_L,m_Pelvis_Swing/2.0,m_Pelvis_Swing/2.0);
+    pelvis_offset_r=wsin(m_Time,m_Z_Move_PeriodTime,m_Z_Move_Phase_Shift+2.0*PI/m_Z_Move_PeriodTime*m_SSP_Time_Start_L,-m_Pelvis_Offset/2.0,-m_Pelvis_Offset/2.0);
+  }
+  else if(m_Time<=m_SSP_Time_Start_R)
+  {
+    x_move_l=wsin(m_SSP_Time_End_L,m_X_Move_PeriodTime,m_X_Move_Phase_Shift+2.0*PI/m_X_Move_PeriodTime*m_SSP_Time_Start_L,m_X_Move_Amplitude,m_X_Move_Amplitude_Shift);
+    y_move_l=wsin(m_SSP_Time_End_L,m_Y_Move_PeriodTime,m_Y_Move_Phase_Shift+2.0*PI/m_Y_Move_PeriodTime*m_SSP_Time_Start_L,m_Y_Move_Amplitude,m_Y_Move_Amplitude_Shift);
+    z_move_l=wsin(m_SSP_Time_End_L,m_Z_Move_PeriodTime,m_Z_Move_Phase_Shift+2.0*PI/m_Z_Move_PeriodTime*m_SSP_Time_Start_L,m_Z_Move_Amplitude,m_Z_Move_Amplitude_Shift);
+    c_move_l=wsin(m_SSP_Time_End_L,m_A_Move_PeriodTime,m_A_Move_Phase_Shift+2.0*PI/m_A_Move_PeriodTime*m_SSP_Time_Start_L,m_A_Move_Amplitude,m_A_Move_Amplitude_Shift);
+    x_move_r=wsin(m_SSP_Time_End_L,m_X_Move_PeriodTime,m_X_Move_Phase_Shift+2.0*PI/m_X_Move_PeriodTime*m_SSP_Time_Start_L,-m_X_Move_Amplitude,-m_X_Move_Amplitude_Shift);
+    y_move_r=wsin(m_SSP_Time_End_L,m_Y_Move_PeriodTime,m_Y_Move_Phase_Shift+2.0*PI/m_Y_Move_PeriodTime*m_SSP_Time_Start_L,-m_Y_Move_Amplitude,-m_Y_Move_Amplitude_Shift);
+    z_move_r=wsin(m_SSP_Time_Start_R,m_Z_Move_PeriodTime,m_Z_Move_Phase_Shift+2.0*PI/m_Z_Move_PeriodTime*m_SSP_Time_Start_R,m_Z_Move_Amplitude,m_Z_Move_Amplitude_Shift);
+    c_move_r=wsin(m_SSP_Time_End_L,m_A_Move_PeriodTime,m_A_Move_Phase_Shift+2.0*PI/m_A_Move_PeriodTime*m_SSP_Time_Start_L,-m_A_Move_Amplitude,-m_A_Move_Amplitude_Shift);
+    pelvis_offset_l=0.0;
+    pelvis_offset_r=0.0;
+  }
+  else if(m_Time<=m_SSP_Time_End_R)
+  {
+    x_move_l=wsin(m_Time,m_X_Move_PeriodTime,m_X_Move_Phase_Shift+2.0*PI/m_X_Move_PeriodTime*m_SSP_Time_Start_R+PI,m_X_Move_Amplitude,m_X_Move_Amplitude_Shift);
+    y_move_l=wsin(m_Time,m_Y_Move_PeriodTime,m_Y_Move_Phase_Shift+2.0*PI/m_Y_Move_PeriodTime*m_SSP_Time_Start_R+PI,m_Y_Move_Amplitude,m_Y_Move_Amplitude_Shift);
+    z_move_l=wsin(m_SSP_Time_End_L,m_Z_Move_PeriodTime,m_Z_Move_Phase_Shift+2.0*PI/m_Z_Move_PeriodTime*m_SSP_Time_Start_L,m_Z_Move_Amplitude,m_Z_Move_Amplitude_Shift);
+    c_move_l=wsin(m_Time,m_A_Move_PeriodTime,m_A_Move_Phase_Shift+2.0*PI/m_A_Move_PeriodTime*m_SSP_Time_Start_R+PI,m_A_Move_Amplitude,m_A_Move_Amplitude_Shift);
+    x_move_r=wsin(m_Time,m_X_Move_PeriodTime,m_X_Move_Phase_Shift+2.0*PI/m_X_Move_PeriodTime*m_SSP_Time_Start_R+PI,-m_X_Move_Amplitude,-m_X_Move_Amplitude_Shift);
+    y_move_r=wsin(m_Time,m_Y_Move_PeriodTime,m_Y_Move_Phase_Shift+2.0*PI/m_Y_Move_PeriodTime*m_SSP_Time_Start_R+PI,-m_Y_Move_Amplitude,-m_Y_Move_Amplitude_Shift);
+    z_move_r=wsin(m_Time,m_Z_Move_PeriodTime,m_Z_Move_Phase_Shift+2.0*PI/m_Z_Move_PeriodTime*m_SSP_Time_Start_R,m_Z_Move_Amplitude,m_Z_Move_Amplitude_Shift);
+    c_move_r=wsin(m_Time,m_A_Move_PeriodTime,m_A_Move_Phase_Shift+2.0*PI/m_A_Move_PeriodTime*m_SSP_Time_Start_R+PI,-m_A_Move_Amplitude,-m_A_Move_Amplitude_Shift);
+    pelvis_offset_l=wsin(m_Time,m_Z_Move_PeriodTime,m_Z_Move_Phase_Shift+2.0*PI/m_Z_Move_PeriodTime*m_SSP_Time_Start_R,m_Pelvis_Offset/2,m_Pelvis_Offset/2);
+    pelvis_offset_r=wsin(m_Time,m_Z_Move_PeriodTime,m_Z_Move_Phase_Shift+2.0*PI/m_Z_Move_PeriodTime*m_SSP_Time_Start_R,-m_Pelvis_Swing/2,-m_Pelvis_Swing/2);
+  }
+  else
+  {
+    x_move_l=wsin(m_SSP_Time_End_R,m_X_Move_PeriodTime,m_X_Move_Phase_Shift+2.0*PI/m_X_Move_PeriodTime*m_SSP_Time_Start_R+PI,m_X_Move_Amplitude,m_X_Move_Amplitude_Shift);
+    y_move_l=wsin(m_SSP_Time_End_R,m_Y_Move_PeriodTime,m_Y_Move_Phase_Shift+2.0*PI/m_Y_Move_PeriodTime*m_SSP_Time_Start_R+PI,m_Y_Move_Amplitude,m_Y_Move_Amplitude_Shift);
+    z_move_l=wsin(m_SSP_Time_End_L,m_Z_Move_PeriodTime,m_Z_Move_Phase_Shift+2.0*PI/m_Z_Move_PeriodTime*m_SSP_Time_Start_L,m_Z_Move_Amplitude,m_Z_Move_Amplitude_Shift);
+    c_move_l=wsin(m_SSP_Time_End_R,m_A_Move_PeriodTime,m_A_Move_Phase_Shift+2.0*PI/m_A_Move_PeriodTime*m_SSP_Time_Start_R+PI,m_A_Move_Amplitude,m_A_Move_Amplitude_Shift);
+    x_move_r=wsin(m_SSP_Time_End_R,m_X_Move_PeriodTime,m_X_Move_Phase_Shift+2.0*PI/m_X_Move_PeriodTime*m_SSP_Time_Start_R+PI,-m_X_Move_Amplitude,-m_X_Move_Amplitude_Shift);
+    y_move_r=wsin(m_SSP_Time_End_R,m_Y_Move_PeriodTime,m_Y_Move_Phase_Shift+2.0*PI/m_Y_Move_PeriodTime*m_SSP_Time_Start_R+PI,-m_Y_Move_Amplitude,-m_Y_Move_Amplitude_Shift);
+    z_move_r=wsin(m_SSP_Time_End_R,m_Z_Move_PeriodTime,m_Z_Move_Phase_Shift+2.0*PI/m_Z_Move_PeriodTime*m_SSP_Time_Start_R,m_Z_Move_Amplitude,m_Z_Move_Amplitude_Shift);
+    c_move_r=wsin(m_SSP_Time_End_R,m_A_Move_PeriodTime,m_A_Move_Phase_Shift+2.0*PI/m_A_Move_PeriodTime*m_SSP_Time_Start_R+PI,-m_A_Move_Amplitude,-m_A_Move_Amplitude_Shift);
+    pelvis_offset_l=0.0;
+    pelvis_offset_r=0.0;
+  }
+  a_move_l=0.0;
+  b_move_l=0.0;
+  a_move_r=0.0;
+  b_move_r=0.0;
+
+  ep[0]=x_swap+x_move_r+m_X_Offset;
+  ep[1]=y_swap+y_move_r-m_Y_Offset / 2.0;
+  ep[2]=z_swap+z_move_r+m_Z_Offset;
+  ep[3]=a_swap+a_move_r-m_R_Offset / 2.0;
+  ep[4]=b_swap+b_move_r+m_P_Offset;
+  ep[5]=c_swap+c_move_r-m_A_Offset / 2.0;
+  ep[6]=x_swap+x_move_l+m_X_Offset;
+  ep[7]=y_swap+y_move_l+m_Y_Offset / 2.0;
+  ep[8]=z_swap+z_move_l+m_Z_Offset;
+  ep[9]=a_swap+a_move_l+m_R_Offset / 2.0;
+  ep[10]=b_swap+b_move_l+m_P_Offset;
+  ep[11]=c_swap+c_move_l+m_A_Offset / 2.0;
+
+  // Compute body swing
+/*  if(m_Time<=m_SSP_Time_End_L)
+  {
+    m_Body_Swing_Y=-ep[7];
+    m_Body_Swing_Z=ep[8];
+  }
+  else
+  {
+    m_Body_Swing_Y=-ep[1];
+    m_Body_Swing_Z=ep[2];
+  }
+  m_Body_Swing_Z-=DARWIN_LEG_LENGTH;*/
+
+  // Compute arm swing
+  if(m_X_Move_Amplitude==0)
+  {
+    angle[12]=0; // Right
+    angle[13]=0; // Left
+  }
+  else
+  {
+    angle[12]=wsin(m_Time,m_PeriodTime,0.0,-m_X_Move_Amplitude*m_Arm_Swing_Gain,0.0);
+    angle[13]=wsin(m_Time,m_PeriodTime,0.0,m_X_Move_Amplitude*m_Arm_Swing_Gain,0.0);
+  }
+
+  if(ram_data[DARWIN_WALK_CNTRL]&WALK_STATUS)
+  {
+    m_Time += stairs_period;
+    if(m_Time >= m_PeriodTime)
+      m_Time = 0;
+  }
+
+  // Compute angles with the inverse kinematics
+  if((darwin_leg_ik(&angle[0],ep[0],ep[1],ep[2],ep[3],ep[4],ep[5])!=1) || 
+     (darwin_leg_ik(&angle[6],ep[6],ep[7],ep[8],ep[9],ep[10],ep[11])!=1))
+    return;// Do not use angles
+
+  // Compute motor value
+  if(manager_get_module(R_HIP_YAW)==MM_WALKING)
+    manager_current_angles[R_HIP_YAW]=((-180.0*angle[0])/PI)*65536.0;
+  if(manager_get_module(R_HIP_ROLL)==MM_WALKING)
+    manager_current_angles[R_HIP_ROLL]=((-180.0*(angle[1]+pelvis_offset_r))/PI)*65536.0;
+  if(manager_get_module(R_HIP_PITCH)==MM_WALKING)
+    manager_current_angles[R_HIP_PITCH]=((180.0*angle[2])/PI-m_Hip_Pitch_Offset)*65536.0;
+  if(manager_get_module(R_KNEE)==MM_WALKING)
+    manager_current_angles[R_KNEE]=((180.0*angle[3])/PI)*65536.0;
+  if(manager_get_module(R_ANKLE_PITCH)==MM_WALKING)
+    manager_current_angles[R_ANKLE_PITCH]=((-180.0*angle[4])/PI)*65536.0;
+  if(manager_get_module(R_ANKLE_ROLL)==MM_WALKING)
+    manager_current_angles[R_ANKLE_ROLL]=((180.0*angle[5])/PI)*65536.0;
+  if(manager_get_module(L_HIP_YAW)==MM_WALKING)
+    manager_current_angles[L_HIP_YAW]=((-180.0*angle[6])/PI)*65536.0;
+  if(manager_get_module(L_HIP_ROLL)==MM_WALKING)
+    manager_current_angles[L_HIP_ROLL]=((-180.0*(angle[7]+pelvis_offset_l))/PI)*65536.0;
+  if(manager_get_module(L_HIP_PITCH)==MM_WALKING)
+    manager_current_angles[L_HIP_PITCH]=((-180.0*angle[8])/PI+m_Hip_Pitch_Offset)*65536.0;
+  if(manager_get_module(L_KNEE)==MM_WALKING)
+    manager_current_angles[L_KNEE]=((-180.0*angle[9])/PI)*65536.0;
+  if(manager_get_module(L_ANKLE_PITCH)==MM_WALKING)
+    manager_current_angles[L_ANKLE_PITCH]=((180.0*angle[10])/PI)*65536.0;
+  if(manager_get_module(L_ANKLE_ROLL)==MM_WALKING)
+    manager_current_angles[L_ANKLE_ROLL]=((180.0*angle[11])/PI)*65536.0;
+  if(manager_get_module(R_SHOULDER_PITCH)==MM_WALKING)
+    manager_current_angles[R_SHOULDER_PITCH]=(angle[12]-48.345)*65536.0;
+  if(manager_get_module(L_SHOULDER_PITCH)==MM_WALKING)
+    manager_current_angles[L_SHOULDER_PITCH]=(-angle[13]+41.313)*65536.0;
+}
+
+// operation functions
+uint8_t stairs_in_range(unsigned short int address, unsigned short int length)
+{
+  if(ram_in_window(WALK_BASE_ADDRESS,WALK_MEM_LENGTH,address,length) ||
+     ram_in_window(WALK_EEPROM_ADDRESS,WALK_EEPROM_LENGTH,address,length))
+    return 0x01;
+  else
+    return 0x00;
+}
+
+void stairs_process_read_cmd(unsigned short int address,unsigned short int length,unsigned char *data)
+{
+
+}
+
+void stairs_process_write_cmd(unsigned short int address,unsigned short int length,unsigned char *data)
+{
+  uint16_t i;
+
+  // walk control
+  if(ram_in_range(DARWIN_WALK_CNTRL,address,length))
+  {
+    if(data[DARWIN_WALK_CNTRL-address]&WALK_START)
+      stairs_start();
+    if(data[DARWIN_WALK_CNTRL-address]&WALK_STOP)
+      stairs_stop();
+  }
+  if(ram_in_range(DARWIN_WALK_STEP_FW_BW,address,length))
+    ram_data[DARWIN_WALK_STEP_FW_BW]=data[DARWIN_WALK_STEP_FW_BW-address];
+  if(ram_in_range(DARWIN_WALK_STEP_LEFT_RIGHT,address,length))
+    ram_data[DARWIN_WALK_STEP_LEFT_RIGHT]=data[DARWIN_WALK_STEP_LEFT_RIGHT-address];
+  if(ram_in_range(DARWIN_WALK_STEP_DIRECTION,address,length))
+    ram_data[DARWIN_WALK_STEP_DIRECTION]=data[DARWIN_WALK_STEP_DIRECTION-address];
+  // walk parameters
+  for(i=WALK_EEPROM_ADDRESS;i<=WALK_EEPROM_ADDRESS+WALK_EEPROM_LENGTH;i++)
+    if(ram_in_range(i,address,length))
+      ram_data[i]=data[i-address];
+}
+