diff --git a/src/dynamixel_motor.cpp b/src/dynamixel_motor.cpp
index 05a9da30c8eea3a2d9756db96a85d529ae290fea..da30e7f95c7395f1b535ce6d7d738162a009e4a8 100644
--- a/src/dynamixel_motor.cpp
+++ b/src/dynamixel_motor.cpp
@@ -1233,7 +1233,9 @@ double CDynamixelMotor::get_current_speed(void)
   {
     try{
       this->dynamixel_dev->read_word_register(this->registers[current_speed],&data);
-      c_speed = this->to_speeds(data);
+      c_speed = this->to_speeds(data&0x03FF);
+      if(data&0x0400)
+        c_speed*=-1.0;
     }catch(CDynamixelAlarmException &e){
       /* handle dynamixel exception */
       if(e.get_alarm()&this->alarms)
@@ -1312,10 +1314,8 @@ double CDynamixelMotor::get_current_effort(void)
     try{
       this->dynamixel_dev->read_byte_register(this->registers[current_load],&data);
       c_effort = (double)((data&0x3FF)*100.0/1023);
-      if (this->get_current_speed() < 0)
-      {
+      if(data&0x0400)
 	c_effort *= -1.0;
-      }
     }catch(CDynamixelAlarmException &e){
       /* handle dynamixel exception */
       if(e.get_alarm()&this->alarms)
diff --git a/src/dynamixel_motor_group.cpp b/src/dynamixel_motor_group.cpp
index 0e86391e1aa4d376d4ad011973c3c50d51d97888..0e48af04f65daca15748f568362d00b1b1f8b610 100644
--- a/src/dynamixel_motor_group.cpp
+++ b/src/dynamixel_motor_group.cpp
@@ -1211,7 +1211,9 @@ void CDynamixelMotorGroup::get_current_speed(std::vector<double> &speeds)
     {
       try{
 	this->dynamixel_dev[i]->read_word_register(this->registers[i][current_speed],&data);
-	speeds[i] = this->to_speeds(i, data);
+	speeds[i] = this->to_speeds(i, data&0x03FF);
+        if(data&0x0400)
+          speeds[i]*=-1.0;
       }catch(CDynamixelAlarmException &e){
 	/* handle dynamixel exception */
 	if(e.get_alarm()&this->alarms[i])
@@ -1225,7 +1227,6 @@ void CDynamixelMotorGroup::get_current_speed(std::vector<double> &speeds)
 void CDynamixelMotorGroup::get_current_effort(std::vector<double> &efforts)
 {
   unsigned short int c_effort;
-  unsigned short int c_speed;
 
   efforts.resize(this->servo_id.size());
 
@@ -1240,12 +1241,9 @@ void CDynamixelMotorGroup::get_current_effort(std::vector<double> &efforts)
     {
       try{
 	this->dynamixel_dev[i]->read_word_register(this->registers[i][current_load],&c_effort);
-	this->dynamixel_dev[i]->read_word_register(this->registers[i][current_speed],&c_speed);
 	efforts[i] = (double)((c_effort&0x3FF)*100.0/1023);
-	if (this->to_speeds(i, c_speed) < 0)
-	{
+	if (c_effort&0x0400)
 	  efforts[i] *= -1.0;
-	}
       }catch(CDynamixelAlarmException &e){
 	/* handle dynamixel exception */
 	if(e.get_alarm()&this->alarms[i])