diff --git a/src/walking.c b/src/walking.c
index 86f808d9813a098abfe2a2c252f40892d4faaed1..127f736f25a77ab4552304a98d3d8de89ced770b 100755
--- a/src/walking.c
+++ b/src/walking.c
@@ -3,13 +3,11 @@
 #include "bioloid_math.h"
 #include "ram.h"
 #include <math.h>
+#include <stdio.h>
 
 enum {PHASE0=0x00,PHASE1=0x40,PHASE2=0x80,PHASE3=0xC0};
 
 // Walking control
-float X_MOVE_AMPLITUDE=0.0;//mm
-float Y_MOVE_AMPLITUDE=0.0;//mm
-float A_MOVE_AMPLITUDE=0.0;//degrees
 uint8_t A_MOVE_AIM_ON=0x00;
 
 // internal motion variables
@@ -80,7 +78,7 @@ void update_param_time()
   float m_SSP_Ratio;
   float m_SSP_Time;
 
-  m_PeriodTime=ram_data[BIOLOID_WALK_PERIOD_TIME_L]+ram_data[BIOLOID_WALK_PERIOD_TIME_H];
+  m_PeriodTime=((float)((int16_t)(ram_data[BIOLOID_WALK_PERIOD_TIME_L]+(ram_data[BIOLOID_WALK_PERIOD_TIME_H]<<8))));
   m_SSP_Ratio=1.0-((float)ram_data[BIOLOID_WALK_DSP_RATIO])/256.0;
 
   m_SSP_Time=m_PeriodTime*m_SSP_Ratio;
@@ -103,45 +101,50 @@ void update_param_time()
   m_Phase_Time3=(m_SSP_Time_End_R+m_SSP_Time_Start_R)/2.0;
 
   // m_pelvis_offset and m_pelvis_Swing in degrees
-  m_Pelvis_Offset=((float)ram_data[BIOLOID_WALK_PELVIS_OFFSET])/8.0;
+  m_Pelvis_Offset=((float)ram_data[BIOLOID_WALK_PELVIS_OFFSET])*PI/1440.0;
   m_Pelvis_Swing=m_Pelvis_Offset*0.35;
   m_Arm_Swing_Gain=((float)ram_data[BIOLOID_WALK_ARM_SWING_GAIN])/32.0;
 }
 
 void update_param_move()
 {
+  float target_x_amplitude;
+  float target_y_amplitude;
+  float target_a_amplitude;
   static float current_x_amplitude=0;
   static float current_y_amplitude=0;
   static float current_a_amplitude=0;
 
+  target_x_amplitude=((float)ram_data[BIOLOID_WALK_STEP_FW_BW]);
   // change longitudinal and transversal velocities to get to the target ones
-  if(current_x_amplitude<X_MOVE_AMPLITUDE)
+  if(current_x_amplitude<target_x_amplitude)
   {
     current_x_amplitude+=(((float)ram_data[BIOLOID_WALK_MAX_VEL])*m_PeriodTime)/1000.0;
-    if(current_x_amplitude>X_MOVE_AMPLITUDE)
-      current_x_amplitude=X_MOVE_AMPLITUDE;
+    if(current_x_amplitude>target_x_amplitude)
+      current_x_amplitude=target_x_amplitude;
   }
-  else if(current_x_amplitude>X_MOVE_AMPLITUDE)
+  else if(current_x_amplitude>target_x_amplitude)
   {
     current_x_amplitude-=(((float)ram_data[BIOLOID_WALK_MAX_VEL])*m_PeriodTime)/1000.0;
-    if(current_x_amplitude<X_MOVE_AMPLITUDE)
-      current_x_amplitude=X_MOVE_AMPLITUDE;
+    if(current_x_amplitude<target_x_amplitude)
+      current_x_amplitude=target_x_amplitude;
   }
   m_X_Move_Amplitude=current_x_amplitude;
   m_X_Swap_Amplitude=current_x_amplitude*((float)ram_data[BIOLOID_WALK_STEP_FW_BW_RATIO])/256.0;
 
   // Right/Left
-  if(current_y_amplitude<Y_MOVE_AMPLITUDE)
+  target_y_amplitude=((float)ram_data[BIOLOID_WALK_STEP_LEFT_RIGHT]);
+  if(current_y_amplitude<target_y_amplitude)
   {
     current_y_amplitude+=(((float)ram_data[BIOLOID_WALK_MAX_VEL])*m_PeriodTime)/1000.0;
-    if(current_y_amplitude>Y_MOVE_AMPLITUDE)
-      current_y_amplitude=Y_MOVE_AMPLITUDE;
+    if(current_y_amplitude>target_y_amplitude)
+      current_y_amplitude=target_y_amplitude;
   }
-  else if(current_y_amplitude>Y_MOVE_AMPLITUDE)
+  else if(current_y_amplitude>target_y_amplitude)
   {
     current_y_amplitude-=(((float)ram_data[BIOLOID_WALK_MAX_VEL])*m_PeriodTime)/1000.0;
-    if(current_y_amplitude<Y_MOVE_AMPLITUDE)
-      current_y_amplitude=Y_MOVE_AMPLITUDE;
+    if(current_y_amplitude<target_y_amplitude)
+      current_y_amplitude=target_y_amplitude;
   }
   m_Y_Move_Amplitude=current_y_amplitude/2.0;
   if(m_Y_Move_Amplitude>0)
@@ -156,17 +159,18 @@ void update_param_move()
   m_Z_Swap_Amplitude_Shift=m_Z_Swap_Amplitude;
 
   // Direction
-  if(current_a_amplitude<A_MOVE_AMPLITUDE)
+  target_a_amplitude=((float)ram_data[BIOLOID_WALK_STEP_DIRECTION]);
+  if(current_a_amplitude<target_a_amplitude)
   {
     current_a_amplitude+=(((float)ram_data[BIOLOID_WALK_MAX_ROT_VEL])*m_PeriodTime)/8000.0;
-    if(current_a_amplitude>A_MOVE_AMPLITUDE)
-      current_a_amplitude=A_MOVE_AMPLITUDE;
+    if(current_a_amplitude>target_a_amplitude)
+      current_a_amplitude=target_a_amplitude;
   }
-  else if(current_a_amplitude>A_MOVE_AMPLITUDE)
+  else if(current_a_amplitude>target_a_amplitude)
   {
     current_a_amplitude-=(((float)ram_data[BIOLOID_WALK_MAX_ROT_VEL])*m_PeriodTime)/8000.0;
-    if(current_a_amplitude<A_MOVE_AMPLITUDE)
-      current_a_amplitude=A_MOVE_AMPLITUDE;
+    if(current_a_amplitude<target_a_amplitude)
+      current_a_amplitude=target_a_amplitude;
   }
 
   if(A_MOVE_AIM_ON==0x00)
@@ -195,7 +199,7 @@ void update_param_balance()
   m_R_Offset = ((float)((int8_t)ram_data[BIOLOID_WALK_ROLL_OFFSET]))*PI/1440.0;// (r_offset/8)*(pi/180)
   m_P_Offset = ((float)((int8_t)ram_data[BIOLOID_WALK_PITCH_OFFSET]))*PI/1440.0;// (p_offset/8)*(pi/180)
   m_A_Offset = ((float)((int8_t)ram_data[BIOLOID_WALK_YAW_OFFSET]))*PI/1440.0;// (a_offset/8)*(pi/180)
-  m_Hip_Pitch_Offset = ((float)((int16_t)(ram_data[BIOLOID_WALK_HIP_PITCH_OFF_L]+(ram_data[BIOLOID_WALK_HIP_PITCH_OFF_L]<<8))))/1024.0;
+  m_Hip_Pitch_Offset = ((float)((int16_t)(ram_data[BIOLOID_WALK_HIP_PITCH_OFF_L]+(ram_data[BIOLOID_WALK_HIP_PITCH_OFF_H]<<8))))/1024.0;
 }
 
 // public functions
@@ -275,9 +279,9 @@ void walking_process(void)
         ram_data[BIOLOID_WALK_CNTRL]&=(~WALK_STATUS);
       else
       {
-        X_MOVE_AMPLITUDE=0.0;
-        Y_MOVE_AMPLITUDE=0.0;
-        A_MOVE_AMPLITUDE=0.0;
+        ram_data[BIOLOID_WALK_STEP_FW_BW]=0.0;
+        ram_data[BIOLOID_WALK_STEP_LEFT_RIGHT]=0.0;
+        ram_data[BIOLOID_WALK_STEP_DIRECTION]=0.0;
       }
     }
   }
@@ -299,9 +303,9 @@ void walking_process(void)
         ram_data[BIOLOID_WALK_CNTRL]&=~WALK_STATUS;
       else
       {
-        X_MOVE_AMPLITUDE=0.0;
-        Y_MOVE_AMPLITUDE=0.0;
-        A_MOVE_AMPLITUDE=0.0;
+        ram_data[BIOLOID_WALK_STEP_FW_BW]=0.0;
+        ram_data[BIOLOID_WALK_STEP_LEFT_RIGHT]=0.0;
+        ram_data[BIOLOID_WALK_STEP_DIRECTION]=0.0;
       }
     }
   }
@@ -424,8 +428,8 @@ void walking_process(void)
   }
   else
   {
-    angle[12]=wsin(m_Time,m_PeriodTime,PI*1.5,-m_X_Move_Amplitude*m_Arm_Swing_Gain,0);
-    angle[13]=wsin(m_Time,m_PeriodTime,PI*1.5,m_X_Move_Amplitude*m_Arm_Swing_Gain,0);
+    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[BIOLOID_WALK_CNTRL]&WALK_STATUS)
@@ -444,7 +448,7 @@ void walking_process(void)
   if(manager_get_module(R_HIP_YAW)==MM_WALKING)
     manager_current_angles[R_HIP_YAW]=((180.0*(angle[0]-PI/4.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;
+    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)
@@ -452,23 +456,23 @@ void walking_process(void)
   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;
+    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/4.0))/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;
+    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;
+    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;
+    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]=((180.0*angle[12])/PI)*65536.0;
+    manager_current_angles[R_SHOULDER_PITCH]=(angle[12]-90.0)*65536.0;
   if(manager_get_module(L_SHOULDER_PITCH)==MM_WALKING)
-    manager_current_angles[L_SHOULDER_PITCH]=((-180.0*angle[13])/PI)*65536.0;
+    manager_current_angles[L_SHOULDER_PITCH]=(-angle[13]+90.0)*65536.0;
 }
 
 // operation functions