diff --git a/src/dynamixel_motor.cpp b/src/dynamixel_motor.cpp
index 857b9de8b609f83baffd1e08413905143ad29df3..2adaea157a882354647cad81c75fa47cc78232f5 100644
--- a/src/dynamixel_motor.cpp
+++ b/src/dynamixel_motor.cpp
@@ -197,6 +197,8 @@ void CDynamixelMotor::reset_motor(void)
   unsigned int current_position;
   unsigned int maximum_pwm;
 
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   try{
     this->read_register(this->registers[current_pos],current_position);
   }catch(CDynamixelAlarmException &e){
@@ -238,6 +240,7 @@ void CDynamixelMotor::get_model(void)
   {
     try{
       this->dynamixel_dev->read_word_register(0x0000,&model);
+      this->registers=NULL;
       switch(model)
       {
 	case 0x000C: this->info.model="AX-12A";
@@ -373,7 +376,7 @@ void CDynamixelMotor::get_model(void)
          this->info.ext_memory_map=true;
 		     break;
   case 0x460: this->info.model="XM540-W270";
-         this->info.max_angle=350.0;
+         this->info.max_angle=360.0;
          this->info.center_angle=180.0;
          this->info.max_speed=1023 * 0.229;
          this->info.max_current=0.0;
@@ -384,6 +387,18 @@ void CDynamixelMotor::get_model(void)
          this->info.multi_turn=true;
          this->info.ext_memory_map=true;
          break;
+  case 0x3FC: this->info.model="XM430-W350";
+         this->info.max_angle=360.0;
+         this->info.center_angle=180.0;
+         this->info.max_speed=2760;
+         this->info.max_current=0.0;
+         this->info.encoder_resolution=4095;
+         this->info.gear_ratio=353.5;
+         this->registers=xm_reg;
+         this->info.pid_control=true;
+         this->info.multi_turn=true;
+         this->info.ext_memory_map=true;
+         break;
 	default: this->info.model="unknown";
 		 break;
       }
@@ -393,8 +408,11 @@ void CDynamixelMotor::get_model(void)
 	this->reset_motor();
       throw;
     }
-    this->read_register(this->registers[firmware_version],value);
-    this->info.firmware_ver=value;
+    if(this->registers!=NULL)
+    {
+      this->read_register(this->registers[firmware_version],value);
+      this->info.firmware_ver=value;
+    }
   }
 }
 
@@ -405,6 +423,8 @@ void CDynamixelMotor::set_control_mode(control_mode mode)
 
   if(this->mode!=mode)
   {
+    if(this->registers==NULL)
+      throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
     if(this->enabled)
       this->disable();
     if(this->info.ext_memory_map)
@@ -459,6 +479,8 @@ void CDynamixelMotor::set_drive_mode(bool time_based,bool reverse)
   }
   else
     this->reverse_mode=false;
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   this->write_register(this->registers[drive_mode],value);
 }
 
@@ -704,6 +726,8 @@ void CDynamixelMotor::set_position_range(double min, double max)
   }
   else
   {
+    if(this->registers==NULL)
+      throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
     this->config.max_angle=max;
     this->config.min_angle=min;
     this->write_register(this->registers[max_angle_limit],max_pos);
@@ -719,6 +743,8 @@ void CDynamixelMotor::get_position_range(double *min, double *max)
 {
   unsigned int angle_limit;
 
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   this->read_register(this->registers[max_angle_limit],angle_limit);
   (*max)=this->to_angles(angle_limit);
   this->read_register(this->registers[min_angle_limit],angle_limit);
@@ -729,6 +755,8 @@ int CDynamixelMotor::get_temperature_limit(void)
 {
   unsigned int limit;
 
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   this->read_register(this->registers[temp_limit],limit);
 
   return limit;
@@ -745,6 +773,8 @@ void CDynamixelMotor::set_temperature_limit(int limit)
   }
   else
   {
+    if(this->registers==NULL)
+      throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
     this->config.max_temperature=limit;
     value=limit;
     this->write_register(this->registers[temp_limit],value);
@@ -755,6 +785,8 @@ void CDynamixelMotor::get_voltage_limits(double *min, double *max)
 {
   unsigned int value;
 
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   this->read_register(this->registers[min_voltage_limit],value);
   *min=((double)value/10.0);
   this->read_register(this->registers[max_voltage_limit],value);
@@ -779,6 +811,8 @@ void CDynamixelMotor::set_voltage_limits(double min, double max)
     }
     else
     {
+      if(this->registers==NULL)
+        throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
       this->config.min_voltage=min;
       this->config.max_voltage=max;
       value=min*10;
@@ -793,6 +827,8 @@ unsigned char CDynamixelMotor::get_led_alarms(void)
 {
   unsigned int led_alarms;
 
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   this->read_register(this->registers[alarm_led],led_alarms);
 
   return led_alarms;
@@ -809,6 +845,8 @@ void CDynamixelMotor::set_led_alarms(unsigned char alarms)
   }
   else
   {
+    if(this->registers==NULL)
+      throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
     value=alarms;
     this->write_register(this->registers[alarm_led],value);
   }
@@ -818,6 +856,8 @@ unsigned char CDynamixelMotor::get_turn_off_alarms(void)
 {
   unsigned int shutdown_alarms;
 
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   this->read_register(this->registers[alarm_shtdwn],shutdown_alarms);
 
   return shutdown_alarms;
@@ -834,6 +874,8 @@ void CDynamixelMotor::set_turn_off_alarms(unsigned char alarms)
   }
   else
   {
+    if(this->registers==NULL)
+      throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
     this->alarms=alarms;
     value=alarms;
     this->write_register(this->registers[alarm_shtdwn],value);
@@ -845,6 +887,8 @@ double CDynamixelMotor::get_max_pwm(void)
   unsigned int load;
   double torque;
 
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   this->read_register(this->registers[max_pwm],load);
   torque=(load&0x3FF)*100.0/1023.0;
   if(load>0x3FF)
@@ -858,6 +902,8 @@ double CDynamixelMotor::get_pwm_limit(void)
   unsigned int load;
   double torque;
 
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   this->read_register(this->registers[pwm_limit],load);
   if(this->info.ext_memory_map)
     torque=((signed short int)load)*100.0/885.0;
@@ -881,6 +927,8 @@ void CDynamixelMotor::set_max_pwm(double torque_ratio)
   }
   else
   {
+    if(this->registers==NULL)
+      throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
     load=torque_ratio*1023.0/100.0;
     this->config.max_pwm=torque_ratio;
     this->write_register(this->registers[max_pwm],load);
@@ -897,6 +945,8 @@ void CDynamixelMotor::set_pwm_limit(double torque_ratio)
   }
   else
   {
+    if(this->registers==NULL)
+      throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
     if(this->info.ext_memory_map)
       load=torque_ratio*885.0/100.0;
     else
@@ -910,6 +960,8 @@ double CDynamixelMotor::get_current_limit(void)
   double current;
   unsigned int data;
   
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   this->read_register(this->registers[current_limit],data);
   current=((signed short int)data)*2.69/1000.0;
 
@@ -920,6 +972,8 @@ void CDynamixelMotor::set_current_limit(double current)
 {
   unsigned int data;
 
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   data=(signed short int)(current*1000.0/2.69);
   this->write_register(this->registers[current_limit],data);
 }
@@ -929,6 +983,8 @@ double CDynamixelMotor::get_speed_limit(void)
   unsigned int data;
   double speed;
 
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   this->read_register(this->registers[velocity_limit],data);
   speed=this->to_speeds(data);
 
@@ -939,6 +995,8 @@ void CDynamixelMotor::set_speed_limit(double speed)
 {
   unsigned int data;
 
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   data=this->from_speeds(speed);
   this->write_register(this->registers[velocity_limit],data);
 }
@@ -950,6 +1008,8 @@ void CDynamixelMotor::get_compliance_control(TDynamixel_compliance &config)
 
   if(!this->info.pid_control)
   {
+    if(this->registers==NULL)
+      throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
     this->read_register(this->registers[cw_comp_margin],value);
     config.cw_compliance_margin=value;
     this->read_register(this->registers[ccw_comp_margin],value);
@@ -977,6 +1037,8 @@ void CDynamixelMotor::set_compliance_control(TDynamixel_compliance &config)
       /*  handle exceptions */
       throw CDynamixelMotorException(_HERE_,"Invalid counterclockwise compliance margin.");
     }
+    if(this->registers==NULL)
+      throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
     if(config.cw_compliance_slope>=1 && config.cw_compliance_slope<=5) config.cw_compliance_slope=4;
     else if(config.cw_compliance_slope>=6 && config.cw_compliance_slope<=11) config.cw_compliance_slope=8;
     else if(config.cw_compliance_slope>=12 && config.cw_compliance_slope<=23) config.cw_compliance_slope=16;
@@ -1022,6 +1084,8 @@ void CDynamixelMotor::get_pid_control(TDynamixel_pid &config)
 
   if(this->info.pid_control)
   {
+    if(this->registers==NULL)
+      throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
     this->read_register(this->registers[pos_pid_p],value);
     config.p=value;
     this->read_register(this->registers[pos_pid_i],value);
@@ -1037,6 +1101,8 @@ void CDynamixelMotor::set_pid_control(TDynamixel_pid &config)
 
   if(this->info.pid_control)
   {
+    if(this->registers==NULL)
+      throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
     this->pid.p=config.p;
     this->pid.i=config.i;
     this->pid.d=config.d;
@@ -1071,11 +1137,15 @@ void CDynamixelMotor::set_feedfwd_control(double acc_gain,double vel_gain)
 
 void CDynamixelMotor::turn_led_on(void)
 {
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   this->write_register(this->registers[led],1);
 }
 
 void CDynamixelMotor::turn_led_off(void)
 {
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   this->write_register(this->registers[led],0);
 }
 
@@ -1091,12 +1161,16 @@ void CDynamixelMotor::lock(void)
 
 void CDynamixelMotor::enable(void)
 {
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   this->write_register(this->registers[torque_en],1);
   this->enabled=true;
 }
 
 void CDynamixelMotor::disable(void)
 {
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   this->write_register(this->registers[torque_en],0);
   this->enabled=false;
 }
@@ -1105,6 +1179,8 @@ void CDynamixelMotor::move_absolute_angle(double angle,double speed,double curre
 {
   unsigned int data;
 
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   if(current==std::numeric_limits<double>::infinity())
   {
     this->set_control_mode(position_ctrl);
@@ -1146,6 +1222,8 @@ void CDynamixelMotor::move_relative_angle(double angle,double speed,double curre
   unsigned int data,pos;
   double abs_angle;
 
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   if(current==std::numeric_limits<double>::infinity())
   {
     this->set_control_mode(position_ctrl);
@@ -1190,6 +1268,8 @@ void CDynamixelMotor::move_speed(double speed)
 {
   unsigned int data;
 
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   this->set_control_mode(velocity_ctrl);
   if(speed>this->info.max_speed)
     speed=this->info.max_speed;
@@ -1203,6 +1283,8 @@ void CDynamixelMotor::move_pwm(double pwm_ratio)
 {
   unsigned int torque=0;
 
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   this->set_control_mode(pwm_ctrl);
   if(pwm_ratio>100.0)
     pwm_ratio=100.0;
@@ -1226,6 +1308,8 @@ void CDynamixelMotor::move_current(double current)
 {
   unsigned int data;
 
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   this->set_control_mode(current_ctrl);
   if(current>this->info.max_current)
     current=this->info.max_current;
@@ -1241,6 +1325,8 @@ void CDynamixelMotor::stop(void)
 
   if(this->mode==position_ctrl || this->mode==ext_position_ctrl || this->mode==current_pos_ctrl)
   {
+    if(this->registers==NULL)
+      throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
     this->read_register(this->registers[current_pos],current_position);
     if(this->to_angles(current_position)>this->config.max_angle)
       current_position=from_angles(this->config.max_angle);
@@ -1261,6 +1347,8 @@ double CDynamixelMotor::get_current_angle(void)
   unsigned int data;
   double current_position;
 
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   this->read_register(this->registers[current_pos],data);
   current_position = this->to_angles(data);
 
@@ -1272,6 +1360,8 @@ double CDynamixelMotor::get_current_speed(void)
   unsigned int data;
   double c_speed;
 
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   this->read_register(this->registers[current_speed],data);
   c_speed = this->to_speeds(data&0x03FF);
   if(data&0x0400)
@@ -1285,6 +1375,8 @@ double CDynamixelMotor::get_current_temperature(void)
   unsigned int data;
   double c_temp;
 
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   this->read_register(this->registers[current_temp],data);
   c_temp = (double)data;
 
@@ -1296,6 +1388,8 @@ double CDynamixelMotor::get_current_voltage(void)
   unsigned int data;
   double c_voltage;
 
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   this->read_register(this->registers[current_voltage],data);
   c_voltage = (double)data/10.0;
 
@@ -1307,6 +1401,8 @@ double CDynamixelMotor::get_current_pwm(void)
   unsigned int data;
   double c_effort;
 
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   if(this->info.ext_memory_map)
   {
     this->read_register(this->registers[current_pwm],data);
@@ -1328,6 +1424,8 @@ double CDynamixelMotor::get_current_current(void)
   double current;
   unsigned int data;
 
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   this->read_register(this->registers[current_load],data);
   current=((signed short int)data)*2.69/1000.0;
 
@@ -1338,6 +1436,8 @@ unsigned int CDynamixelMotor::get_punch(void)
 {  
   unsigned int value;
 
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   this->read_register(this->registers[punch],value);
 
   return value;
@@ -1347,6 +1447,8 @@ void CDynamixelMotor::set_punch(unsigned int punch_value)
 {
   if(punch_value<0x0020 || punch_value>0x03FF) 
     throw CDynamixelMotorException(_HERE_,"Invalid Punch value");
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   this->config.punch=punch_value;
   this->write_register(this->registers[punch],punch_value);
 }
@@ -1355,6 +1457,8 @@ control_mode CDynamixelMotor::get_control_mode(void)
 {
   unsigned int value;
 
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   if(this->info.ext_memory_map)
   {
     this->read_register(this->registers[op_mode],value);
@@ -1384,6 +1488,8 @@ void CDynamixelMotor::get_drive_mode(bool &time_based,bool &reverse)
 {
   unsigned int value;
 
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   try{
     this->read_register(this->registers[drive_mode],value);
     if(value&0x04)
@@ -1416,6 +1522,8 @@ void CDynamixelMotor::get_drive_mode(bool &time_based,bool &reverse)
 
 unsigned short int CDynamixelMotor::get_register_address(reg_id id)
 {
+  if(this->registers==NULL)
+    throw CDynamixelMotorException(_HERE_,"Unknown dynamixel model.");
   return this->registers[id].address;
 }