diff --git a/servo_firmware/ax12/src/comm.c b/servo_firmware/ax12/src/comm.c
index eef884ae0f30c6b89214cb295ee8225943576f79..51f5ac9c7e217979cceda08acbbb044b79332069 100644
--- a/servo_firmware/ax12/src/comm.c
+++ b/servo_firmware/ax12/src/comm.c
@@ -2,6 +2,7 @@
 #include "dyn_slave.h"
 #include "mem.h"
 #include "gpio.h"
+#include "motor_control.h"
 
 uint8_t dyn_error;
 uint8_t tmp_data[RAM_SIZE];
@@ -28,9 +29,15 @@ void do_write(uint8_t address,uint8_t length,uint8_t *data)
       if(data[num]==0x00) gpio_led_off();
       else gpio_led_on();
     }
+    else if(i==Torque_Enable)
+    {
+      if(data[num]==0x00)
+        motor_set_pwm(0x0000,0x0000);      
+    }
+    else if(i==Goal_Position_L || i==Goal_Position_H)
+      ram_data[Torque_Enable]=0x01;
     num++;
   } 
-  ram_write(address,length,data);
 }
 
 void comm_init(void)
diff --git a/servo_firmware/ax12/src/dyn_slave.c b/servo_firmware/ax12/src/dyn_slave.c
index 66b93b8f3c20a044bb0cc67479eb7e84da65e784..ac06161ea224ed76744f3ad2688bd807e325b5d8 100644
--- a/servo_firmware/ax12/src/dyn_slave.c
+++ b/servo_firmware/ax12/src/dyn_slave.c
@@ -2,6 +2,7 @@
 #include <avr/io.h>
 #include "dyn_slave.h"
 #include "gpio.h"
+#include "mem.h"
 
 uint8_t dyn_slave_id;
 uint8_t dyn_slave_data[128];
@@ -58,8 +59,12 @@ ISR(USART_RXC_vect)
             dyn_slave_num_rx_bytes++;
             break;
     default: if(dyn_slave_num_rx_bytes==length)
+             {
+               dyn_slave_num_rx_bytes=0;
                dyn_slave_packet_ready=1;
-             dyn_slave_num_rx_bytes++;
+             }
+             else
+               dyn_slave_num_rx_bytes++;
              break;
   }
   sei();// enable all interrutps
@@ -171,8 +176,7 @@ uint8_t dyn_slave_sync_read_id_present(void)
 {
   uint8_t i,num;
 
-  num=dyn_slave_num_rx_bytes-8;
-  dyn_slave_num_rx_bytes=0;
+  num=dyn_slave_data[3]-4;
   for(i=0;i<num;i++)
   {
     if(dyn_slave_data[7+i]==dyn_slave_id)
@@ -191,8 +195,7 @@ uint8_t dyn_slave_sync_write_id_present(uint8_t **data)
 {
   uint8_t i,num;
 
-  num=(dyn_slave_num_rx_bytes-8)/(dyn_slave_data[6]+1);
-  dyn_slave_num_rx_bytes=0;
+  num=(dyn_slave_data[3]-4)/(dyn_slave_data[6]+1);
   for(i=0;i<num;i++)
   {
     if(dyn_slave_data[7+i*(dyn_slave_data[6]+1)]==dyn_slave_id)
@@ -209,8 +212,7 @@ uint8_t dyn_slave_bulk_read_id_present(uint8_t *address,uint8_t *length)
 {
   uint8_t i,num;
 
-  num=(dyn_slave_num_rx_bytes-6)/3;
-  dyn_slave_num_rx_bytes=0;
+  num=(dyn_slave_data[3]-2)/3;
   for(i=0;i<num;i++)
   {
     if(dyn_slave_data[5+i*3]==dyn_slave_id)
@@ -231,8 +233,7 @@ uint8_t dyn_slave_bulk_write_id_present(uint8_t *address,uint8_t *length,uint8_t
 {
   uint8_t i,num;
 
-  num=dyn_slave_num_rx_bytes;
-  dyn_slave_num_rx_bytes=0;
+  num=dyn_slave_data[3]+4;
   for(i=5;i<num;)
   {
     if(dyn_slave_data[i]==dyn_slave_id)
@@ -252,25 +253,31 @@ void dyn_slave_send_status(uint8_t error,uint8_t length, uint8_t *data)
 {
   uint8_t i,cs=0;
 
-  dyn_slave_data[0]=0xFF;
-  dyn_slave_data[1]=0xFF;
-  dyn_slave_data[2]=dyn_slave_id;
-  cs+=dyn_slave_id;
-  dyn_slave_data[3]=length+2;
-  cs+=length+2;
-  dyn_slave_data[4]=error;
-  cs+=error;
-  for(i=0;i<length;i++)
+  if(dyn_slave_data[2]!=0xFE)
   {
-    dyn_slave_data[5+i]=data[i];
-    cs+=data[i];
+    if(dyn_slave_data[4]==INST_PING || ((dyn_slave_data[4]==INST_READ || 
+       dyn_slave_data[4]==INST_SYNC_READ || dyn_slave_data[4]==INST_BULK_READ) && 
+       ram_data[Status_Return_Level]!=0x00) || ram_data[Status_Return_Level]==0x02) 
+    dyn_slave_data[0]=0xFF;
+    dyn_slave_data[1]=0xFF;
+    dyn_slave_data[2]=dyn_slave_id;
+    cs+=dyn_slave_id;
+    dyn_slave_data[3]=length+2;
+    cs+=length+2;
+    dyn_slave_data[4]=error;
+    cs+=error;
+    for(i=0;i<length;i++)
+    {
+      dyn_slave_data[5+i]=data[i];
+      cs+=data[i];
+    }
+    dyn_slave_data[5+i]=~cs;
+    // set in tex mode
+    dyn_slave_set_tx();
+    // start transmission
+    dyn_slave_num_tx_bytes=1;
+    UDR=dyn_slave_data[0];
   }
-  dyn_slave_data[5+i]=~cs;
-  // set in tex mode
-  dyn_slave_set_tx();
-  // start transmission
-  dyn_slave_num_tx_bytes=1;
-  UDR=dyn_slave_data[0];
 }
 
 uint8_t dyn_slave_is_send_done(void)
diff --git a/servo_firmware/ax12/src/mem.c b/servo_firmware/ax12/src/mem.c
index 530c3e3af051bc126c1554ea54e55c58d782a511..bd86da21220fc0ea455eeae315c6b578e22a3763 100644
--- a/servo_firmware/ax12/src/mem.c
+++ b/servo_firmware/ax12/src/mem.c
@@ -12,7 +12,7 @@ void ram_init(void)
 {
   uint8_t i;
 
-  for(i=0;i<Alarm_Shutdown;i++)
+  for(i=0;i<=Alarm_Shutdown;i++)
     ram_data[i]=eeprom_read_byte(&eeprom_data[i]);
   for(;i<=KD_H;i++)
     ram_data[i]=0x00;
diff --git a/servo_firmware/ax12/src/motor_control.c b/servo_firmware/ax12/src/motor_control.c
index bde876e20675bc290c147b8290705a25c68ef27f..77053e3f000b7653d3597d9f723d4e4a9b086322 100644
--- a/servo_firmware/ax12/src/motor_control.c
+++ b/servo_firmware/ax12/src/motor_control.c
@@ -138,15 +138,18 @@ void motor_control_loop(void)
       pwm_output=torque_limit;
     else if(pwm_output<-torque_limit)
       pwm_output=-torque_limit;
-    if(pwm_output<0)
-    {
-      pwm_output=-pwm_output;
-      motor_set_pwm((uint16_t)pwm_output,0x0000);
-    }
-    else
-      motor_set_pwm(0x0000,(uint16_t)pwm_output);
-    ram_data[Present_Load_L]=pwm_output&0xFF;
-    ram_data[Present_Load_H]=((pwm_output>>8)&0xFF);
+//    if(ram_data[Torque_Enable])
+//    {
+      if(pwm_output<0)
+      {
+        pwm_output=-pwm_output;
+        motor_set_pwm((uint16_t)pwm_output,0x0000);
+      }
+      else
+        motor_set_pwm(0x0000,(uint16_t)pwm_output);
+      ram_data[Present_Load_L]=pwm_output&0xFF;
+      ram_data[Present_Load_H]=((pwm_output>>8)&0xFF);
+//    }
     /* update control loop variable */
     if(count==CONTROL_COUNT)
       count=0;