diff --git a/dynamixel_manager/include/modules/joint_motion.h b/dynamixel_manager/include/modules/joint_motion.h
index bd92ebf2b1a5cf856c9980857a8fc64d19b22d5e..ac6daed767a268936383f21732232b588db27d8b 100644
--- a/dynamixel_manager/include/modules/joint_motion.h
+++ b/dynamixel_manager/include/modules/joint_motion.h
@@ -18,15 +18,15 @@ typedef struct{
   TMemory *memory;
   TMemModule mem_module;
   unsigned short int ram_base_address;
-  long int target_angles[DYN_MANAGER_MAX_NUM_DEVICES];//48|16 
-  long int target_speeds[DYN_MANAGER_MAX_NUM_DEVICES];//48|16 
-  long int target_accels[DYN_MANAGER_MAX_NUM_DEVICES];//48|16 
-  long int target_stop_angles[DYN_MANAGER_MAX_NUM_DEVICES];//48|16
-  long int current_angles[DYN_MANAGER_MAX_NUM_DEVICES];//48|16 
-  long int current_speeds[DYN_MANAGER_MAX_NUM_DEVICES];//48|16 
-  char dir[DYN_MANAGER_MAX_NUM_DEVICES];// joint_direction 
-  long int motion_period;
-  short int motion_period_ms;
+  signed long long int target_angles[DYN_MANAGER_MAX_NUM_DEVICES];//48|16 
+  signed long long int target_speeds[DYN_MANAGER_MAX_NUM_DEVICES];//48|16 
+  signed long long int target_accels[DYN_MANAGER_MAX_NUM_DEVICES];//48|16 
+  signed long long int target_stop_angles[DYN_MANAGER_MAX_NUM_DEVICES];//48|16
+  signed long long int current_angles[DYN_MANAGER_MAX_NUM_DEVICES];//48|16 
+  signed long long int current_speeds[DYN_MANAGER_MAX_NUM_DEVICES];//48|16 
+  signed char dir[DYN_MANAGER_MAX_NUM_DEVICES];// joint_direction 
+  unsigned long long int motion_period;
+  unsigned short int motion_period_ms;
   unsigned char stop[NUM_JOINT_GROUPS];
   unsigned char moving[NUM_JOINT_GROUPS];
   unsigned int group_servos[NUM_JOINT_GROUPS];
diff --git a/dynamixel_manager/src/modules/joint_motion.c b/dynamixel_manager/src/modules/joint_motion.c
index ffc40f9cb843704cc0f24e722987db1b0dd6fb75..e3fb1a847d0924f9ed7e2f8c74b6d1f1c1c2fe22 100644
--- a/dynamixel_manager/src/modules/joint_motion.c
+++ b/dynamixel_manager/src/modules/joint_motion.c
@@ -88,48 +88,48 @@ void joint_motion_pre_process(void *module)
             if(abs(joint->target_angles[i]-joint->current_angles[i])>=65)
             {
               moving=0x01;
-              if(joint->current_speeds[i]!=joint->dir[i]*joint->target_speeds[i])// it is necessary to change the current speed
+              if(joint->current_speeds[i]!=((signed char)joint->dir[i])*joint->target_speeds[i])// it is necessary to change the current speed
               {
-                joint->current_angles[i]+=((joint->current_speeds[i]*joint->motion_period)>>17);
-                if(joint->current_speeds[i]>joint->dir[i]*joint->target_speeds[i])
+                joint->current_angles[i]+=(((signed long long int)(joint->current_speeds[i]*joint->motion_period))>>17);
+                if(joint->current_speeds[i]>((signed char)joint->dir[i])*joint->target_speeds[i])
                 {
-                  joint->current_speeds[i]-=((joint->target_accels[i]*joint->motion_period)>>16);// reduce speed
-                  if(joint->current_speeds[i]<joint->dir[i]*joint->target_speeds[i])
-                    joint->current_speeds[i]=joint->dir[i]*joint->target_speeds[i];
+                  joint->current_speeds[i]-=(((signed long long int)(joint->target_accels[i]*joint->motion_period))>>16);// reduce speed
+                  if(joint->current_speeds[i]<((signed char)joint->dir[i])*joint->target_speeds[i])
+                    joint->current_speeds[i]=((signed char)joint->dir[i])*joint->target_speeds[i];
                 }
                 else
                 {
-                  joint->current_speeds[i]+=((joint->target_accels[i]*joint->motion_period)>>16);// increase speed
-                  if(joint->current_speeds[i]>joint->dir[i]*joint->target_speeds[i])
-                    joint->current_speeds[i]=joint->dir[i]*joint->target_speeds[i];
+                  joint->current_speeds[i]+=(((signed long long int)(joint->target_accels[i]*joint->motion_period))>>16);// increase speed
+                  if(joint->current_speeds[i]>((signed char)joint->dir[i])*joint->target_speeds[i])
+                    joint->current_speeds[i]=((signed char)joint->dir[i])*joint->target_speeds[i];
                 }
-                joint->current_angles[i]+=((joint->current_speeds[i]*joint->motion_period)>>17);
-                if(joint->dir[i]==1 && joint->current_angles[i]>joint->target_angles[i])
+                joint->current_angles[i]+=(((signed long long int)(joint->current_speeds[i]*joint->motion_period))>>17);
+                if(((signed char)joint->dir[i])==1 && joint->current_angles[i]>joint->target_angles[i])
                   joint->current_angles[i]=joint->target_angles[i];
-                if(joint->dir[i]==-1 && joint->current_angles[i]<joint->target_angles[i])
+                if(((signed char)joint->dir[i])==-1 && joint->current_angles[i]<joint->target_angles[i])
                   joint->current_angles[i]=joint->target_angles[i];
               }  
               else
               {
                 if(abs(joint->target_angles[i]-joint->current_angles[i])>joint->target_stop_angles[i])// constant speed phase
                 {
-                  joint->current_angles[i]+=((joint->current_speeds[i]*joint->motion_period)>>16);
-                  if(joint->dir[i]==1 && joint->current_angles[i]>joint->target_angles[i])
+                  joint->current_angles[i]+=(((signed long long int)(joint->current_speeds[i]*joint->motion_period))>>16);
+                  if(((signed char)joint->dir[i])==1 && joint->current_angles[i]>joint->target_angles[i])
                     joint->current_angles[i]=joint->target_angles[i];
-                  if(joint->dir[i]==-1 && joint->current_angles[i]<joint->target_angles[i])
+                  if(((signed char)joint->dir[i])==-1 && joint->current_angles[i]<joint->target_angles[i])
                     joint->current_angles[i]=joint->target_angles[i];
                 }
                 else// deceleration phase
                 {
-                  joint->current_angles[i]=joint->current_angles[i]+((joint->current_speeds[i]*joint->motion_period)>>17);
-                  joint->target_speeds[i]=joint->target_speeds[i]-((joint->target_accels[i]*joint->motion_period)>>16);
+                  joint->current_angles[i]=joint->current_angles[i]+(((signed long long int)(joint->current_speeds[i]*joint->motion_period))>>17);
+                  joint->target_speeds[i]=joint->target_speeds[i]-(((signed long long int)(joint->target_accels[i]*joint->motion_period))>>16);
                   if(joint->target_speeds[i]<0)
                     joint->target_speeds[i]=0;
-                  joint->current_speeds[i]=joint->dir[i]*joint->target_speeds[i];
-                  joint->current_angles[i]=joint->current_angles[i]+((joint->current_speeds[i]*joint->motion_period)>>17);
-                  if(joint->dir[i]==1 && joint->current_angles[i]>joint->target_angles[i])
+                  joint->current_speeds[i]=((signed char)joint->dir[i])*joint->target_speeds[i];
+                  joint->current_angles[i]=joint->current_angles[i]+(((signed long long int)(joint->current_speeds[i]*joint->motion_period))>>17);
+                  if(((signed char)joint->dir[i])==1 && joint->current_angles[i]>joint->target_angles[i])
                     joint->current_angles[i]=joint->target_angles[i];
-                  if(joint->dir[i]==-1 && joint->current_angles[i]<joint->target_angles[i])
+                  if(((signed char)joint->dir[i])==-1 && joint->current_angles[i]<joint->target_angles[i])
                     joint->current_angles[i]=joint->target_angles[i];
                 }
               }
@@ -139,14 +139,6 @@ void joint_motion_pre_process(void *module)
               joint->current_speeds[i]=0;
             }
             joint->mmodule.manager->servo_values[i].target_angle=joint->current_angles[i];
-            if(joint->mmodule.manager->servo_configs[i]->pid)
-            {
-            }
-            else
-            {
-              joint->mmodule.manager->servo_values[i].cw_compliance=5;
-              joint->mmodule.manager->servo_values[i].ccw_compliance=5;
-            }
           }
         }
       }
@@ -224,7 +216,7 @@ unsigned int joint_motion_get_group_servos(TJointMModule *joint,unsigned char gr
 void joint_motion_start(TJointMModule *joint,unsigned char group_id)
 {
   unsigned char i;
-  short int angle;
+  signed long long int angle;
   unsigned int servo_index;
 
   /* initialize the internal variables */
@@ -245,12 +237,13 @@ void joint_motion_start(TJointMModule *joint,unsigned char group_id)
         // current values
         joint->current_angles[i]=joint->mmodule.manager->servo_values[i].target_angle;
         // target angle
-        angle=joint->memory->data[joint->ram_base_address+JOINT_MOTION_SERVO_ANGLES_OFFSET+i*2]+(joint->memory->data[joint->ram_base_address+JOINT_MOTION_SERVO_ANGLES_OFFSET+i*2+1]<<8);
+        angle=(signed long long int)((signed short int)(joint->memory->data[joint->ram_base_address+JOINT_MOTION_SERVO_ANGLES_OFFSET+i*2]+(joint->memory->data[joint->ram_base_address+JOINT_MOTION_SERVO_ANGLES_OFFSET+i*2+1]<<8)));
+        angle=angle<<9;
         if(angle>joint->mmodule.manager->servo_configs[i]->ccw_angle_limit)
           angle=joint->mmodule.manager->servo_configs[i]->ccw_angle_limit;
         else if(angle<joint->mmodule.manager->servo_configs[i]->cw_angle_limit)
-          angle=joint->mmodule.manager->servo_configs[i]->ccw_angle_limit;
-        joint->target_angles[i]=angle<<9;
+          angle=joint->mmodule.manager->servo_configs[i]->cw_angle_limit;
+        joint->target_angles[i]=angle;
         // target speed
         joint->target_speeds[i]=joint->memory->data[joint->ram_base_address+JOINT_MOTION_SERVO_SPEEDS_OFFSET+i]<<16;
         // target accel
@@ -263,14 +256,14 @@ void joint_motion_start(TJointMModule *joint,unsigned char group_id)
         // check the parameters
         if(abs(joint->target_angles[i]-joint->current_angles[i])>=65)
         {
-          if((joint->target_speeds[i]*joint->target_speeds[i])/joint->target_accels[i]>abs(joint->target_angles[i]-joint->current_angles[i]))
+          if(((unsigned long long int)joint->target_speeds[i]*joint->target_speeds[i])/joint->target_accels[i]>abs(joint->target_angles[i]-joint->current_angles[i]))
           {
-            joint->target_accels[i]=(joint->target_speeds[i]*joint->target_speeds[i])/abs(joint->target_angles[i]-joint->current_angles[i]);
+            joint->target_accels[i]=((unsigned long long int)joint->target_speeds[i]*joint->target_speeds[i])/abs(joint->target_angles[i]-joint->current_angles[i]);
             joint->memory->data[joint->ram_base_address+JOINT_MOTION_SERVO_ACCELS_OFFSET+i]=joint->target_accels[i]>>16;
           }
         }
         // stop angles
-        joint->target_stop_angles[i]=joint->target_speeds[i]*joint->target_speeds[i]/(2*joint->target_accels[i]);
+        joint->target_stop_angles[i]=((signed long long int)joint->target_speeds[i]*joint->target_speeds[i])/(2*joint->target_accels[i]);
         // the current angles, speeds and accelerations are in RAM
         if(joint->target_angles[i]>=joint->current_angles[i])
           joint->dir[i]=1;