From 79e67cc72e1108ad910c89a07ff0ed4b861c8389 Mon Sep 17 00:00:00 2001
From: Anders Blomdell <anders.blomdell@control.lth.se>
Date: Wed, 9 Dec 2020 14:55:10 +0100
Subject: [PATCH] Initial structure and HTML scraper

---
 dynamixel/__init__.py                 |   0
 dynamixel/channel/__init__.py         |   0
 dynamixel/model/2xc430_w250.py        |  65 +++++++
 dynamixel/model/2xl430_w250_t.py      |  65 +++++++
 dynamixel/model/ax_12a.py             |  46 +++++
 dynamixel/model/ax_12w.py             |  46 +++++
 dynamixel/model/ax_18a.py             |  46 +++++
 dynamixel/model/dx_113.py             |  46 +++++
 dynamixel/model/dx_116.py             |  46 +++++
 dynamixel/model/dx_117.py             |  46 +++++
 dynamixel/model/ex_106+.py            |  48 +++++
 dynamixel/model/h42_20_s300_r.py      |  56 ++++++
 dynamixel/model/h42_20_s300_r_a.py    |  71 +++++++
 dynamixel/model/h54_100_s500_r.py     |  56 ++++++
 dynamixel/model/h54_100_s500_r_a.py   |  71 +++++++
 dynamixel/model/h54_200_s500_r.py     |  56 ++++++
 dynamixel/model/h54_200_s500_r_a.py   |  71 +++++++
 dynamixel/model/l42_10_s300_r.py      |  56 ++++++
 dynamixel/model/l54_30_s400_r.py      |  56 ++++++
 dynamixel/model/l54_30_s500_r.py      |  56 ++++++
 dynamixel/model/l54_50_s290_r.py      |  56 ++++++
 dynamixel/model/l54_50_s500_r.py      |  56 ++++++
 dynamixel/model/m42_10_s260_r.py      |  56 ++++++
 dynamixel/model/m42_10_s260_r_a.py    |  71 +++++++
 dynamixel/model/m54_40_s250_r.py      |  56 ++++++
 dynamixel/model/m54_40_s250_r_a.py    |  71 +++++++
 dynamixel/model/m54_60_s250_r.py      |  56 ++++++
 dynamixel/model/m54_60_s250_r_a.py    |  71 +++++++
 dynamixel/model/mx_106t_r.py          |  53 ++++++
 dynamixel/model/mx_106t_r_2.0.py      |  68 +++++++
 dynamixel/model/mx_12w.py             |  49 +++++
 dynamixel/model/mx_28t_r_at_ar.py     |  49 +++++
 dynamixel/model/mx_28t_r_at_ar_2.0.py |  66 +++++++
 dynamixel/model/mx_64t_r_at_ar.py     |  52 +++++
 dynamixel/model/mx_64t_r_at_ar_2.0.py |  68 +++++++
 dynamixel/model/ph42_020_s300_r.py    |  72 +++++++
 dynamixel/model/ph54_100_s500_r.py    |  72 +++++++
 dynamixel/model/ph54_200_s500_r.py    |  72 +++++++
 dynamixel/model/pm42_010_s260_r.py    |  72 +++++++
 dynamixel/model/pm54_040_s250_r.py    |  72 +++++++
 dynamixel/model/pm54_060_s250_r.py    |  72 +++++++
 dynamixel/model/rx_10.py              |  46 +++++
 dynamixel/model/rx_24f.py             |  46 +++++
 dynamixel/model/rx_28.py              |  46 +++++
 dynamixel/model/rx_64.py              |  46 +++++
 dynamixel/model/xc430_w150_t.py       |  65 +++++++
 dynamixel/model/xc430_w240_t.py       |  65 +++++++
 dynamixel/model/xh430_v210_r.py       |  67 +++++++
 dynamixel/model/xh430_v350_r.py       |  67 +++++++
 dynamixel/model/xh430_w210_t_r.py     |  67 +++++++
 dynamixel/model/xh430_w350_t_r.py     |  67 +++++++
 dynamixel/model/xh540_v150_r.py       |  69 +++++++
 dynamixel/model/xh540_v270_r.py       |  69 +++++++
 dynamixel/model/xh540_w150_t_r.py     |  69 +++++++
 dynamixel/model/xh540_w270_t_r.py     |  69 +++++++
 dynamixel/model/xl430_w250_t.py       |  65 +++++++
 dynamixel/model/xl_320.py             |  45 +++++
 dynamixel/model/xm430_w210_t_r.py     |  67 +++++++
 dynamixel/model/xm430_w350_t_r.py     |  67 +++++++
 dynamixel/model/xm540_w150_t_r.py     |  69 +++++++
 dynamixel/model/xm540_w270_t_r.py     |  69 +++++++
 dynamixel/model/xw540_t140_r.py       |  66 +++++++
 dynamixel/model/xw540_t260_r.py       |  66 +++++++
 dynamixel/protocol/Protocol2.py       |   2 +
 dynamixel/protocol/__init__.py        |   1 +
 dynamixel/servo/__init__.py           |  30 +++
 tools/html2desc.py                    | 265 ++++++++++++++++++++++++++
 67 files changed, 4003 insertions(+)
 create mode 100644 dynamixel/__init__.py
 create mode 100644 dynamixel/channel/__init__.py
 create mode 100644 dynamixel/model/2xc430_w250.py
 create mode 100644 dynamixel/model/2xl430_w250_t.py
 create mode 100644 dynamixel/model/ax_12a.py
 create mode 100644 dynamixel/model/ax_12w.py
 create mode 100644 dynamixel/model/ax_18a.py
 create mode 100644 dynamixel/model/dx_113.py
 create mode 100644 dynamixel/model/dx_116.py
 create mode 100644 dynamixel/model/dx_117.py
 create mode 100644 dynamixel/model/ex_106+.py
 create mode 100644 dynamixel/model/h42_20_s300_r.py
 create mode 100644 dynamixel/model/h42_20_s300_r_a.py
 create mode 100644 dynamixel/model/h54_100_s500_r.py
 create mode 100644 dynamixel/model/h54_100_s500_r_a.py
 create mode 100644 dynamixel/model/h54_200_s500_r.py
 create mode 100644 dynamixel/model/h54_200_s500_r_a.py
 create mode 100644 dynamixel/model/l42_10_s300_r.py
 create mode 100644 dynamixel/model/l54_30_s400_r.py
 create mode 100644 dynamixel/model/l54_30_s500_r.py
 create mode 100644 dynamixel/model/l54_50_s290_r.py
 create mode 100644 dynamixel/model/l54_50_s500_r.py
 create mode 100644 dynamixel/model/m42_10_s260_r.py
 create mode 100644 dynamixel/model/m42_10_s260_r_a.py
 create mode 100644 dynamixel/model/m54_40_s250_r.py
 create mode 100644 dynamixel/model/m54_40_s250_r_a.py
 create mode 100644 dynamixel/model/m54_60_s250_r.py
 create mode 100644 dynamixel/model/m54_60_s250_r_a.py
 create mode 100644 dynamixel/model/mx_106t_r.py
 create mode 100644 dynamixel/model/mx_106t_r_2.0.py
 create mode 100644 dynamixel/model/mx_12w.py
 create mode 100644 dynamixel/model/mx_28t_r_at_ar.py
 create mode 100644 dynamixel/model/mx_28t_r_at_ar_2.0.py
 create mode 100644 dynamixel/model/mx_64t_r_at_ar.py
 create mode 100644 dynamixel/model/mx_64t_r_at_ar_2.0.py
 create mode 100644 dynamixel/model/ph42_020_s300_r.py
 create mode 100644 dynamixel/model/ph54_100_s500_r.py
 create mode 100644 dynamixel/model/ph54_200_s500_r.py
 create mode 100644 dynamixel/model/pm42_010_s260_r.py
 create mode 100644 dynamixel/model/pm54_040_s250_r.py
 create mode 100644 dynamixel/model/pm54_060_s250_r.py
 create mode 100644 dynamixel/model/rx_10.py
 create mode 100644 dynamixel/model/rx_24f.py
 create mode 100644 dynamixel/model/rx_28.py
 create mode 100644 dynamixel/model/rx_64.py
 create mode 100644 dynamixel/model/xc430_w150_t.py
 create mode 100644 dynamixel/model/xc430_w240_t.py
 create mode 100644 dynamixel/model/xh430_v210_r.py
 create mode 100644 dynamixel/model/xh430_v350_r.py
 create mode 100644 dynamixel/model/xh430_w210_t_r.py
 create mode 100644 dynamixel/model/xh430_w350_t_r.py
 create mode 100644 dynamixel/model/xh540_v150_r.py
 create mode 100644 dynamixel/model/xh540_v270_r.py
 create mode 100644 dynamixel/model/xh540_w150_t_r.py
 create mode 100644 dynamixel/model/xh540_w270_t_r.py
 create mode 100644 dynamixel/model/xl430_w250_t.py
 create mode 100644 dynamixel/model/xl_320.py
 create mode 100644 dynamixel/model/xm430_w210_t_r.py
 create mode 100644 dynamixel/model/xm430_w350_t_r.py
 create mode 100644 dynamixel/model/xm540_w150_t_r.py
 create mode 100644 dynamixel/model/xm540_w270_t_r.py
 create mode 100644 dynamixel/model/xw540_t140_r.py
 create mode 100644 dynamixel/model/xw540_t260_r.py
 create mode 100644 dynamixel/protocol/Protocol2.py
 create mode 100644 dynamixel/protocol/__init__.py
 create mode 100644 dynamixel/servo/__init__.py
 create mode 100755 tools/html2desc.py

diff --git a/dynamixel/__init__.py b/dynamixel/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dynamixel/channel/__init__.py b/dynamixel/channel/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dynamixel/model/2xc430_w250.py b/dynamixel/model/2xc430_w250.py
new file mode 100644
index 0000000..80b014c
--- /dev/null
+++ b/dynamixel/model/2xc430_w250.py
@@ -0,0 +1,65 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class 2XC430_W250(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=1160),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=None),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='secondary_id', address=12, size=1, default=255),
+        Row(name='protocol_type', address=13, size=1, default=2),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=10),
+        Row(name='temperature_limit', address=31, size=1, default=80),
+        Row(name='max_voltage_limit', address=32, size=2, default=160),
+        Row(name='min_voltage_limit', address=34, size=2, default=60),
+        Row(name='pwm_limit', address=36, size=2, default=885),
+        Row(name='velocity_limit', address=44, size=4, default=275),
+        Row(name='max_position_limit', address=48, size=4, default=4095),
+        Row(name='min_position_limit', address=52, size=4, default=0),
+        Row(name='shutdown', address=63, size=1, default=52)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=64, size=1, default=0),
+        Row(name='led', address=65, size=1, default=0),
+        Row(name='status_return_level', address=68, size=1, default=2),
+        Row(name='registered_instruction', address=69, size=1, default=0),
+        Row(name='hardware_error_status', address=70, size=1, default=0),
+        Row(name='velocity_i_gain', address=76, size=2, default=1920),
+        Row(name='velocity_p_gain', address=78, size=2, default=100),
+        Row(name='position_d_gain', address=80, size=2, default=0),
+        Row(name='position_i_gain', address=82, size=2, default=0),
+        Row(name='position_p_gain', address=84, size=2, default=700),
+        Row(name='feedforward_2nd_gain', address=88, size=2, default=0),
+        Row(name='feedforward_1st_gain', address=90, size=2, default=0),
+        Row(name='bus_watchdog', address=98, size=1, default=0),
+        Row(name='goal_pwm', address=100, size=2, default=None),
+        Row(name='goal_velocity', address=104, size=4, default=None),
+        Row(name='profile_acceleration', address=108, size=4, default=0),
+        Row(name='profile_velocity', address=112, size=4, default=0),
+        Row(name='goal_position', address=116, size=4, default=None),
+        Row(name='realtime_tick', address=120, size=2, default=None),
+        Row(name='moving', address=122, size=1, default=0),
+        Row(name='moving_status', address=123, size=1, default=0),
+        Row(name='present_pwm', address=124, size=2, default=None),
+        Row(name='present_load', address=126, size=2, default=None),
+        Row(name='present_velocity', address=128, size=4, default=None),
+        Row(name='present_position', address=132, size=4, default=None),
+        Row(name='velocity_trajectory', address=136, size=4, default=None),
+        Row(name='position_trajectory', address=140, size=4, default=None),
+        Row(name='present_input_voltage', address=144, size=2, default=None),
+        Row(name='present_temperature', address=146, size=1, default=None),
+        IndirectRow(name='indirect_address', addresses=[range(168, 224, 2), range(578, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(224, 252), range(634, 662)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(2XC430_W250, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/2xl430_w250_t.py b/dynamixel/model/2xl430_w250_t.py
new file mode 100644
index 0000000..3e3ed98
--- /dev/null
+++ b/dynamixel/model/2xl430_w250_t.py
@@ -0,0 +1,65 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class 2XL430_W250_T(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=1090),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=None),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='secondary_id', address=12, size=1, default=255),
+        Row(name='protocol_type', address=13, size=1, default=2),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=10),
+        Row(name='temperature_limit', address=31, size=1, default=72),
+        Row(name='max_voltage_limit', address=32, size=2, default=140),
+        Row(name='min_voltage_limit', address=34, size=2, default=60),
+        Row(name='pwm_limit', address=36, size=2, default=885),
+        Row(name='velocity_limit', address=44, size=4, default=250),
+        Row(name='max_position_limit', address=48, size=4, default=4095),
+        Row(name='min_position_limit', address=52, size=4, default=0),
+        Row(name='shutdown', address=63, size=1, default=52)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=64, size=1, default=0),
+        Row(name='led', address=65, size=1, default=0),
+        Row(name='status_return_level', address=68, size=1, default=2),
+        Row(name='registered_instruction', address=69, size=1, default=0),
+        Row(name='hardware_error_status', address=70, size=1, default=0),
+        Row(name='velocity_i_gain', address=76, size=2, default=1800),
+        Row(name='velocity_p_gain', address=78, size=2, default=100),
+        Row(name='position_d_gain', address=80, size=2, default=2000),
+        Row(name='position_i_gain', address=82, size=2, default=0),
+        Row(name='position_p_gain', address=84, size=2, default=640),
+        Row(name='feedforward_2nd_gain', address=88, size=2, default=0),
+        Row(name='feedforward_1st_gain', address=90, size=2, default=0),
+        Row(name='bus_watchdog', address=98, size=1, default=0),
+        Row(name='goal_pwm', address=100, size=2, default=None),
+        Row(name='goal_velocity', address=104, size=4, default=None),
+        Row(name='profile_acceleration', address=108, size=4, default=0),
+        Row(name='profile_velocity', address=112, size=4, default=0),
+        Row(name='goal_position', address=116, size=4, default=None),
+        Row(name='realtime_tick', address=120, size=2, default=None),
+        Row(name='moving', address=122, size=1, default=0),
+        Row(name='moving_status', address=123, size=1, default=0),
+        Row(name='present_pwm', address=124, size=2, default=None),
+        Row(name='present_load', address=126, size=2, default=None),
+        Row(name='present_velocity', address=128, size=4, default=None),
+        Row(name='present_position', address=132, size=4, default=None),
+        Row(name='velocity_trajectory', address=136, size=4, default=None),
+        Row(name='position_trajectory', address=140, size=4, default=None),
+        Row(name='present_input_voltage', address=144, size=2, default=None),
+        Row(name='present_temperature', address=146, size=1, default=None),
+        IndirectRow(name='indirect_address', addresses=[range(168, 224, 2), range(578, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(224, 252), range(634, 662)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(2XL430_W250_T, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/ax_12a.py b/dynamixel/model/ax_12a.py
new file mode 100644
index 0000000..4572b88
--- /dev/null
+++ b/dynamixel/model/ax_12a.py
@@ -0,0 +1,46 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class AX_12A(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=12),
+        Row(name='firmware_version', address=2, size=1, default=None),
+        Row(name='id', address=3, size=1, default=1),
+        Row(name='baud_rate', address=4, size=1, default=1),
+        Row(name='return_delay_time', address=5, size=1, default=250),
+        Row(name='cw_angle_limit', address=6, size=2, default=0),
+        Row(name='ccw_angle_limit', address=8, size=2, default=1023),
+        Row(name='temperature_limit', address=11, size=1, default=70),
+        Row(name='min_voltage_limit', address=12, size=1, default=60),
+        Row(name='max_voltage_limit', address=13, size=1, default=140),
+        Row(name='max_torque', address=14, size=2, default=1023),
+        Row(name='status_return_level', address=16, size=1, default=2),
+        Row(name='alarm_led', address=17, size=1, default=36),
+        Row(name='shutdown', address=18, size=1, default=36)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=24, size=1, default=0),
+        Row(name='led', address=25, size=1, default=0),
+        Row(name='cw_compliance_margin', address=26, size=1, default=1),
+        Row(name='ccw_compliance_margin', address=27, size=1, default=1),
+        Row(name='cw_compliance_slope', address=28, size=1, default=32),
+        Row(name='ccw_compliance_slope', address=29, size=1, default=32),
+        Row(name='goal_position', address=30, size=2, default=None),
+        Row(name='moving_speed', address=32, size=2, default=None),
+        Row(name='torque_limit', address=34, size=2, default=None),
+        Row(name='present_position', address=36, size=2, default=None),
+        Row(name='present_speed', address=38, size=2, default=None),
+        Row(name='present_load', address=40, size=2, default=None),
+        Row(name='present_voltage', address=42, size=1, default=None),
+        Row(name='present_temperature', address=43, size=1, default=None),
+        Row(name='registered', address=44, size=1, default=0),
+        Row(name='moving', address=46, size=1, default=0),
+        Row(name='lock', address=47, size=1, default=0),
+        Row(name='punch', address=48, size=2, default=32)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol1
+
+    def __init__(self, id):
+        super(AX_12A, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/ax_12w.py b/dynamixel/model/ax_12w.py
new file mode 100644
index 0000000..9ab069d
--- /dev/null
+++ b/dynamixel/model/ax_12w.py
@@ -0,0 +1,46 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class AX_12W(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=300),
+        Row(name='firmware_version', address=2, size=1, default=None),
+        Row(name='id', address=3, size=1, default=1),
+        Row(name='baud_rate', address=4, size=1, default=1),
+        Row(name='return_delay_time', address=5, size=1, default=250),
+        Row(name='cw_angle_limit', address=6, size=2, default=0),
+        Row(name='ccw_angle_limit', address=8, size=2, default=1023),
+        Row(name='temperature_limit', address=11, size=1, default=70),
+        Row(name='min_voltage_limit', address=12, size=1, default=60),
+        Row(name='max_voltage_limit', address=13, size=1, default=140),
+        Row(name='max_torque', address=14, size=2, default=1023),
+        Row(name='status_return_level', address=16, size=1, default=2),
+        Row(name='alarm_led', address=17, size=1, default=36),
+        Row(name='shutdown', address=18, size=1, default=36)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=24, size=1, default=0),
+        Row(name='led', address=25, size=1, default=0),
+        Row(name='cw_compliance_margin', address=26, size=1, default=4),
+        Row(name='ccw_compliance_margin', address=27, size=1, default=4),
+        Row(name='cw_compliance_slope', address=28, size=1, default=64),
+        Row(name='ccw_compliance_slope', address=29, size=1, default=64),
+        Row(name='goal_position', address=30, size=2, default=None),
+        Row(name='moving_speed', address=32, size=2, default=None),
+        Row(name='torque_limit', address=34, size=2, default=None),
+        Row(name='present_position', address=36, size=2, default=None),
+        Row(name='present_speed', address=38, size=2, default=None),
+        Row(name='present_load', address=40, size=2, default=None),
+        Row(name='present_voltage', address=42, size=1, default=None),
+        Row(name='present_temperature', address=43, size=1, default=None),
+        Row(name='registered', address=44, size=1, default=0),
+        Row(name='moving', address=46, size=1, default=0),
+        Row(name='lock', address=47, size=1, default=0),
+        Row(name='punch', address=48, size=2, default=32)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol1
+
+    def __init__(self, id):
+        super(AX_12W, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/ax_18a.py b/dynamixel/model/ax_18a.py
new file mode 100644
index 0000000..ccdf5e1
--- /dev/null
+++ b/dynamixel/model/ax_18a.py
@@ -0,0 +1,46 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class AX_18A(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=18),
+        Row(name='firmware_version', address=2, size=1, default=None),
+        Row(name='id', address=3, size=1, default=1),
+        Row(name='baud_rate', address=4, size=1, default=1),
+        Row(name='return_delay_time', address=5, size=1, default=250),
+        Row(name='cw_angle_limit', address=6, size=2, default=0),
+        Row(name='ccw_angle_limit', address=8, size=2, default=1023),
+        Row(name='temperature_limit', address=11, size=1, default=75),
+        Row(name='min_voltage_limit', address=12, size=1, default=60),
+        Row(name='max_voltage_limit', address=13, size=1, default=140),
+        Row(name='max_torque', address=14, size=2, default=983),
+        Row(name='status_return_level', address=16, size=1, default=2),
+        Row(name='alarm_led', address=17, size=1, default=36),
+        Row(name='shutdown', address=18, size=1, default=36)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=24, size=1, default=0),
+        Row(name='led', address=25, size=1, default=0),
+        Row(name='cw_compliance_margin', address=26, size=1, default=1),
+        Row(name='ccw_compliance_margin', address=27, size=1, default=1),
+        Row(name='cw_compliance_slope', address=28, size=1, default=32),
+        Row(name='ccw_compliance_slope', address=29, size=1, default=32),
+        Row(name='goal_position', address=30, size=2, default=None),
+        Row(name='moving_speed', address=32, size=2, default=None),
+        Row(name='torque_limit', address=34, size=2, default=None),
+        Row(name='present_position', address=36, size=2, default=None),
+        Row(name='present_speed', address=38, size=2, default=None),
+        Row(name='present_load', address=40, size=2, default=None),
+        Row(name='present_voltage', address=42, size=1, default=None),
+        Row(name='present_temperature', address=43, size=1, default=None),
+        Row(name='registered', address=44, size=1, default=0),
+        Row(name='moving', address=46, size=1, default=0),
+        Row(name='lock', address=47, size=1, default=0),
+        Row(name='punch', address=48, size=2, default=32)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol1
+
+    def __init__(self, id):
+        super(AX_18A, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/dx_113.py b/dynamixel/model/dx_113.py
new file mode 100644
index 0000000..ed75651
--- /dev/null
+++ b/dynamixel/model/dx_113.py
@@ -0,0 +1,46 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class DX_113(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=113),
+        Row(name='firmware_version', address=2, size=1, default=None),
+        Row(name='id', address=3, size=1, default=1),
+        Row(name='baud_rate', address=4, size=1, default=34),
+        Row(name='return_delay_time', address=5, size=1, default=250),
+        Row(name='cw_angle_limit', address=6, size=2, default=0),
+        Row(name='ccw_angle_limit', address=8, size=2, default=1023),
+        Row(name='temperature_limit', address=11, size=1, default=85),
+        Row(name='min_voltage_limit', address=12, size=1, default=60),
+        Row(name='max_voltage_limit', address=13, size=1, default=190),
+        Row(name='max_torque', address=14, size=2, default=1023),
+        Row(name='status_return_level', address=16, size=1, default=2),
+        Row(name='alarm_led', address=17, size=1, default=36),
+        Row(name='shutdown', address=18, size=1, default=36)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=24, size=1, default=0),
+        Row(name='led', address=25, size=1, default=0),
+        Row(name='cw_compliance_margin', address=26, size=1, default=0),
+        Row(name='ccw_compliance_margin', address=27, size=1, default=0),
+        Row(name='cw_compliance_slope', address=28, size=1, default=32),
+        Row(name='ccw_compliance_slope', address=29, size=1, default=32),
+        Row(name='goal_position', address=30, size=2, default=None),
+        Row(name='moving_speed', address=32, size=2, default=None),
+        Row(name='torque_limit', address=34, size=2, default=None),
+        Row(name='present_position', address=36, size=2, default=None),
+        Row(name='present_speed', address=38, size=2, default=None),
+        Row(name='present_load', address=40, size=2, default=None),
+        Row(name='present_voltage', address=42, size=1, default=None),
+        Row(name='present_temperature', address=43, size=1, default=None),
+        Row(name='registered', address=44, size=1, default=0),
+        Row(name='moving', address=46, size=1, default=0),
+        Row(name='lock', address=47, size=1, default=0),
+        Row(name='punch', address=48, size=2, default=32)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol1
+
+    def __init__(self, id):
+        super(DX_113, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/dx_116.py b/dynamixel/model/dx_116.py
new file mode 100644
index 0000000..8aedc02
--- /dev/null
+++ b/dynamixel/model/dx_116.py
@@ -0,0 +1,46 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class DX_116(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=116),
+        Row(name='firmware_version', address=2, size=1, default=None),
+        Row(name='id', address=3, size=1, default=1),
+        Row(name='baud_rate', address=4, size=1, default=34),
+        Row(name='return_delay_time', address=5, size=1, default=250),
+        Row(name='cw_angle_limit', address=6, size=2, default=0),
+        Row(name='ccw_angle_limit', address=8, size=2, default=1023),
+        Row(name='temperature_limit', address=11, size=1, default=85),
+        Row(name='min_voltage_limit', address=12, size=1, default=60),
+        Row(name='max_voltage_limit', address=13, size=1, default=190),
+        Row(name='max_torque', address=14, size=2, default=1023),
+        Row(name='status_return_level', address=16, size=1, default=2),
+        Row(name='alarm_led', address=17, size=1, default=36),
+        Row(name='shutdown', address=18, size=1, default=36)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=24, size=1, default=0),
+        Row(name='led', address=25, size=1, default=0),
+        Row(name='cw_compliance_margin', address=26, size=1, default=0),
+        Row(name='ccw_compliance_margin', address=27, size=1, default=0),
+        Row(name='cw_compliance_slope', address=28, size=1, default=32),
+        Row(name='ccw_compliance_slope', address=29, size=1, default=32),
+        Row(name='goal_position', address=30, size=2, default=None),
+        Row(name='moving_speed', address=32, size=2, default=None),
+        Row(name='torque_limit', address=34, size=2, default=None),
+        Row(name='present_position', address=36, size=2, default=None),
+        Row(name='present_speed', address=38, size=2, default=None),
+        Row(name='present_load', address=40, size=2, default=None),
+        Row(name='present_voltage', address=42, size=1, default=None),
+        Row(name='present_temperature', address=43, size=1, default=None),
+        Row(name='registered', address=44, size=1, default=0),
+        Row(name='moving', address=46, size=1, default=0),
+        Row(name='lock', address=47, size=1, default=0),
+        Row(name='punch', address=48, size=2, default=32)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol1
+
+    def __init__(self, id):
+        super(DX_116, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/dx_117.py b/dynamixel/model/dx_117.py
new file mode 100644
index 0000000..a8c09e2
--- /dev/null
+++ b/dynamixel/model/dx_117.py
@@ -0,0 +1,46 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class DX_117(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=117),
+        Row(name='firmware_version', address=2, size=1, default=None),
+        Row(name='id', address=3, size=1, default=1),
+        Row(name='baud_rate', address=4, size=1, default=34),
+        Row(name='return_delay_time', address=5, size=1, default=250),
+        Row(name='cw_angle_limit', address=6, size=2, default=0),
+        Row(name='ccw_angle_limit', address=8, size=2, default=1023),
+        Row(name='temperature_limit', address=11, size=1, default=80),
+        Row(name='min_voltage_limit', address=12, size=1, default=60),
+        Row(name='max_voltage_limit', address=13, size=1, default=190),
+        Row(name='max_torque', address=14, size=2, default=1023),
+        Row(name='status_return_level', address=16, size=1, default=2),
+        Row(name='alarm_led', address=17, size=1, default=36),
+        Row(name='shutdown', address=18, size=1, default=36)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=24, size=1, default=0),
+        Row(name='led', address=25, size=1, default=0),
+        Row(name='cw_compliance_margin', address=26, size=1, default=1),
+        Row(name='ccw_compliance_margin', address=27, size=1, default=1),
+        Row(name='cw_compliance_slope', address=28, size=1, default=32),
+        Row(name='ccw_compliance_slope', address=29, size=1, default=32),
+        Row(name='goal_position', address=30, size=2, default=None),
+        Row(name='moving_speed', address=32, size=2, default=None),
+        Row(name='torque_limit', address=34, size=2, default=None),
+        Row(name='present_position', address=36, size=2, default=None),
+        Row(name='present_speed', address=38, size=2, default=None),
+        Row(name='present_load', address=40, size=2, default=None),
+        Row(name='present_voltage', address=42, size=1, default=None),
+        Row(name='present_temperature', address=43, size=1, default=None),
+        Row(name='registered', address=44, size=1, default=0),
+        Row(name='moving', address=46, size=1, default=0),
+        Row(name='lock', address=47, size=1, default=0),
+        Row(name='punch', address=48, size=2, default=32)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol1
+
+    def __init__(self, id):
+        super(DX_117, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/ex_106+.py b/dynamixel/model/ex_106+.py
new file mode 100644
index 0000000..5fa6e3d
--- /dev/null
+++ b/dynamixel/model/ex_106+.py
@@ -0,0 +1,48 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class EX_106+(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=107),
+        Row(name='firmware_version', address=2, size=1, default=None),
+        Row(name='id', address=3, size=1, default=1),
+        Row(name='baud_rate', address=4, size=1, default=34),
+        Row(name='return_delay_time', address=5, size=1, default=250),
+        Row(name='cw_angle_limit', address=6, size=2, default=0),
+        Row(name='ccw_angle_limit', address=8, size=2, default=4095),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='temperature_limit', address=11, size=1, default=80),
+        Row(name='min_voltage_limit', address=12, size=1, default=60),
+        Row(name='max_voltage_limit', address=13, size=1, default=240),
+        Row(name='max_torque', address=14, size=2, default=1023),
+        Row(name='status_return_level', address=16, size=1, default=2),
+        Row(name='alarm_led', address=17, size=1, default=36),
+        Row(name='shutdown', address=18, size=1, default=36)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=24, size=1, default=0),
+        Row(name='led', address=25, size=1, default=0),
+        Row(name='cw_compliance_margin', address=26, size=1, default=1),
+        Row(name='ccw_compliance_margin', address=27, size=1, default=1),
+        Row(name='cw_compliance_slope', address=28, size=1, default=32),
+        Row(name='ccw_compliance_slope', address=29, size=1, default=32),
+        Row(name='goal_position', address=30, size=2, default=None),
+        Row(name='moving_speed', address=32, size=2, default=None),
+        Row(name='torque_limit', address=34, size=2, default=None),
+        Row(name='present_position', address=36, size=2, default=None),
+        Row(name='present_speed', address=38, size=2, default=None),
+        Row(name='present_load', address=40, size=2, default=None),
+        Row(name='present_voltage', address=42, size=1, default=None),
+        Row(name='present_temperature', address=43, size=1, default=None),
+        Row(name='registered', address=44, size=1, default=0),
+        Row(name='moving', address=46, size=1, default=0),
+        Row(name='lock', address=47, size=1, default=0),
+        Row(name='punch', address=48, size=2, default=0),
+        Row(name='sensed_current', address=56, size=2, default=None)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol1
+
+    def __init__(self, id):
+        super(EX_106+, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/h42_20_s300_r.py b/dynamixel/model/h42_20_s300_r.py
new file mode 100644
index 0000000..8fdb2d4
--- /dev/null
+++ b/dynamixel/model/h42_20_s300_r.py
@@ -0,0 +1,56 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class H42_20_S300_R(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=51200),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='homing_offset', address=13, size=4, default=0),
+        Row(name='moving_threshold', address=17, size=4, default=50),
+        Row(name='temperature_limit', address=21, size=1, default=80),
+        Row(name='max_voltage_limit', address=22, size=2, default=400),
+        Row(name='min_voltage_limit', address=24, size=2, default=150),
+        Row(name='acceleration_limit', address=26, size=4, default=255),
+        Row(name='torque_limit', address=30, size=2, default=465),
+        Row(name='velocity_limit', address=32, size=4, default=10300),
+        Row(name='max_position_limit', address=36, size=4, default=151875),
+        Row(name='min_position_limit', address=40, size=4, default=None),
+        IndirectRow(name='external_port_mode', addresses=[range(44, 48)], size=1),
+        Row(name='shutdown', address=48, size=1, default=58),
+        IndirectRow(name='indirect_address', addresses=[range(49, 561, 2)], size=2)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=562, size=1, default=0),
+        Row(name='led_red', address=563, size=1, default=0),
+        Row(name='led_green', address=564, size=1, default=0),
+        Row(name='led_blue', address=565, size=1, default=0),
+        Row(name='velocity_i_gain', address=586, size=2, default=40),
+        Row(name='velocity_p_gain', address=588, size=2, default=440),
+        Row(name='position_p_gain', address=594, size=2, default=32),
+        Row(name='goal_position', address=596, size=4, default=None),
+        Row(name='goal_velocity', address=600, size=4, default=0),
+        Row(name='goal_torque', address=604, size=2, default=0),
+        Row(name='goal_acceleration', address=606, size=4, default=0),
+        Row(name='moving', address=610, size=1, default=None),
+        Row(name='present_position', address=611, size=4, default=None),
+        Row(name='present_velocity', address=615, size=4, default=None),
+        Row(name='present_current', address=621, size=2, default=None),
+        Row(name='present_input_voltage', address=623, size=2, default=None),
+        Row(name='present_temperature', address=625, size=1, default=None),
+        IndirectRow(name='external_port_data', addresses=[range(626, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(634, 890)], size=1),
+        Row(name='registered_instruction', address=890, size=1, default=0),
+        Row(name='status_return_level', address=891, size=1, default=2),
+        Row(name='hardware_error_status', address=892, size=1, default=0)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(H42_20_S300_R, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/h42_20_s300_r_a.py b/dynamixel/model/h42_20_s300_r_a.py
new file mode 100644
index 0000000..471fabb
--- /dev/null
+++ b/dynamixel/model/h42_20_s300_r_a.py
@@ -0,0 +1,71 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class H42_20_S300_R_A(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=51201),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='sencondary_id', address=12, size=1, default=255),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=20),
+        Row(name='temperature_limit', address=31, size=1, default=80),
+        Row(name='max_voltage_limit', address=32, size=2, default=350),
+        Row(name='min_voltage_limit', address=34, size=2, default=150),
+        Row(name='pwm_limit', address=36, size=2, default=2009),
+        Row(name='current_limit', address=38, size=2, default=4500),
+        Row(name='acceleration_limit', address=40, size=4, default=10765),
+        Row(name='velocity_limit', address=44, size=4, default=2920),
+        Row(name='max_position_limit', address=48, size=4, default=303454),
+        Row(name='min_position_limit', address=52, size=4, default=None),
+        IndirectRow(name='external_port_mode', addresses=[range(56, 60)], size=1),
+        Row(name='shutdown', address=63, size=1, default=52),
+        IndirectRow(name='indirect_address', addresses=[range(168, 424, 2)], size=2)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=512, size=1, default=0),
+        Row(name='led_red', address=513, size=1, default=0),
+        Row(name='led_green', address=514, size=1, default=0),
+        Row(name='led_blue', address=515, size=1, default=0),
+        Row(name='status_return_level', address=516, size=1, default=2),
+        Row(name='registered_instruction', address=517, size=1, default=0),
+        Row(name='hardware_error_status', address=518, size=1, default=0),
+        Row(name='velocity_i_gain', address=524, size=2, default=None),
+        Row(name='velocity_p_gain', address=526, size=2, default=None),
+        Row(name='position_d_gain', address=528, size=2, default=None),
+        Row(name='position_i_gain', address=530, size=2, default=None),
+        Row(name='position_p_gain', address=532, size=2, default=None),
+        Row(name='feedforward_2nd_gain', address=536, size=2, default=None),
+        Row(name='feedforward_1st_gain', address=538, size=2, default=None),
+        Row(name='bus_watchdog', address=546, size=1, default=None),
+        Row(name='goal_pwm', address=548, size=2, default=None),
+        Row(name='goal_current', address=550, size=2, default=None),
+        Row(name='goal_velocity', address=552, size=4, default=None),
+        Row(name='profile_acceleration', address=556, size=4, default=None),
+        Row(name='profile_velocity', address=560, size=4, default=None),
+        Row(name='goal_position', address=564, size=4, default=None),
+        Row(name='realtime_tick', address=568, size=2, default=None),
+        Row(name='moving', address=570, size=1, default=None),
+        Row(name='moving_status', address=571, size=1, default=None),
+        Row(name='present_pwm', address=572, size=2, default=None),
+        Row(name='present_current', address=574, size=2, default=None),
+        Row(name='present_velocity', address=576, size=4, default=None),
+        Row(name='present_position', address=580, size=4, default=None),
+        Row(name='velocity_trajectory', address=584, size=4, default=None),
+        Row(name='position_trajectory', address=588, size=4, default=None),
+        Row(name='present_input_voltage', address=592, size=2, default=None),
+        Row(name='present_temperature', address=594, size=1, default=None),
+        IndirectRow(name='external_port_data', addresses=[range(600, 608, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(634, 762)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(H42_20_S300_R_A, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/h54_100_s500_r.py b/dynamixel/model/h54_100_s500_r.py
new file mode 100644
index 0000000..4870760
--- /dev/null
+++ b/dynamixel/model/h54_100_s500_r.py
@@ -0,0 +1,56 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class H54_100_S500_R(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=53768),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='homing_offset', address=13, size=4, default=0),
+        Row(name='moving_threshold', address=17, size=4, default=50),
+        Row(name='temperature_limit', address=21, size=1, default=80),
+        Row(name='max_voltage_limit', address=22, size=2, default=400),
+        Row(name='min_voltage_limit', address=24, size=2, default=150),
+        Row(name='acceleration_limit', address=26, size=4, default=None),
+        Row(name='torque_limit', address=30, size=2, default=310),
+        Row(name='velocity_limit', address=32, size=4, default=17000),
+        Row(name='max_position_limit', address=36, size=4, default=250961),
+        Row(name='min_position_limit', address=40, size=4, default=None),
+        IndirectRow(name='external_port_mode', addresses=[range(44, 48)], size=1),
+        Row(name='shutdown', address=48, size=1, default=58),
+        IndirectRow(name='indirect_address', addresses=[range(49, 561, 2)], size=2)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=562, size=1, default=0),
+        Row(name='led_red', address=563, size=1, default=0),
+        Row(name='led_green', address=564, size=1, default=0),
+        Row(name='led_blue', address=565, size=1, default=0),
+        Row(name='velocity_i_gain', address=586, size=2, default=16),
+        Row(name='velocity_p_gain', address=588, size=2, default=256),
+        Row(name='position_p_gain', address=594, size=2, default=32),
+        Row(name='goal_position', address=596, size=4, default=None),
+        Row(name='goal_velocity', address=600, size=4, default=0),
+        Row(name='goal_torque', address=604, size=2, default=0),
+        Row(name='goal_acceleration', address=606, size=4, default=0),
+        Row(name='moving', address=610, size=1, default=None),
+        Row(name='present_position', address=611, size=4, default=None),
+        Row(name='present_velocity', address=615, size=4, default=None),
+        Row(name='present_current', address=621, size=2, default=None),
+        Row(name='present_input_voltage', address=623, size=2, default=None),
+        Row(name='present_temperature', address=625, size=1, default=None),
+        IndirectRow(name='external_port_data', addresses=[range(626, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(634, 890)], size=1),
+        Row(name='registered_instruction', address=890, size=1, default=0),
+        Row(name='status_return_level', address=891, size=1, default=2),
+        Row(name='hardware_error_status', address=892, size=1, default=0)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(H54_100_S500_R, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/h54_100_s500_r_a.py b/dynamixel/model/h54_100_s500_r_a.py
new file mode 100644
index 0000000..fdf100e
--- /dev/null
+++ b/dynamixel/model/h54_100_s500_r_a.py
@@ -0,0 +1,71 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class H54_100_S500_R_A(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=53769),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='sencondary_id', address=12, size=1, default=255),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=50),
+        Row(name='temperature_limit', address=31, size=1, default=80),
+        Row(name='max_voltage_limit', address=32, size=2, default=350),
+        Row(name='min_voltage_limit', address=34, size=2, default=150),
+        Row(name='pwm_limit', address=36, size=2, default=2009),
+        Row(name='current_limit', address=38, size=2, default=15900),
+        Row(name='acceleration_limit', address=40, size=4, default=10639),
+        Row(name='velocity_limit', address=44, size=4, default=2920),
+        Row(name='max_position_limit', address=48, size=4, default=501433),
+        Row(name='min_position_limit', address=52, size=4, default=None),
+        IndirectRow(name='external_port_mode', addresses=[range(56, 60)], size=1),
+        Row(name='shutdown', address=63, size=1, default=52),
+        IndirectRow(name='indirect_address', addresses=[range(168, 424, 2)], size=2)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=512, size=1, default=0),
+        Row(name='led_red', address=513, size=1, default=0),
+        Row(name='led_green', address=514, size=1, default=0),
+        Row(name='led_blue', address=515, size=1, default=0),
+        Row(name='status_return_level', address=516, size=1, default=2),
+        Row(name='registered_instruction', address=517, size=1, default=0),
+        Row(name='hardware_error_status', address=518, size=1, default=0),
+        Row(name='velocity_i_gain', address=524, size=2, default=None),
+        Row(name='velocity_p_gain', address=526, size=2, default=None),
+        Row(name='position_d_gain', address=528, size=2, default=None),
+        Row(name='position_i_gain', address=530, size=2, default=None),
+        Row(name='position_p_gain', address=532, size=2, default=None),
+        Row(name='feedforward_2nd_gain', address=536, size=2, default=None),
+        Row(name='feedforward_1st_gain', address=538, size=2, default=None),
+        Row(name='bus_watchdog', address=546, size=1, default=None),
+        Row(name='goal_pwm', address=548, size=2, default=None),
+        Row(name='goal_current', address=550, size=2, default=None),
+        Row(name='goal_velocity', address=552, size=4, default=None),
+        Row(name='profile_acceleration', address=556, size=4, default=None),
+        Row(name='profile_velocity', address=560, size=4, default=None),
+        Row(name='goal_position', address=564, size=4, default=None),
+        Row(name='realtime_tick', address=568, size=2, default=None),
+        Row(name='moving', address=570, size=1, default=None),
+        Row(name='moving_status', address=571, size=1, default=None),
+        Row(name='present_pwm', address=572, size=2, default=None),
+        Row(name='present_current', address=574, size=2, default=None),
+        Row(name='present_velocity', address=576, size=4, default=None),
+        Row(name='present_position', address=580, size=4, default=None),
+        Row(name='velocity_trajectory', address=584, size=4, default=None),
+        Row(name='position_trajectory', address=588, size=4, default=None),
+        Row(name='present_input_voltage', address=592, size=2, default=None),
+        Row(name='present_temperature', address=594, size=1, default=None),
+        IndirectRow(name='external_port_data', addresses=[range(600, 608, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(634, 762)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(H54_100_S500_R_A, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/h54_200_s500_r.py b/dynamixel/model/h54_200_s500_r.py
new file mode 100644
index 0000000..b8fd5e2
--- /dev/null
+++ b/dynamixel/model/h54_200_s500_r.py
@@ -0,0 +1,56 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class H54_200_S500_R(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=54024),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='homing_offset', address=13, size=4, default=0),
+        Row(name='moving_threshold', address=17, size=4, default=50),
+        Row(name='temperature_limit', address=21, size=1, default=80),
+        Row(name='max_voltage_limit', address=22, size=2, default=400),
+        Row(name='min_voltage_limit', address=24, size=2, default=150),
+        Row(name='acceleration_limit', address=26, size=4, default=None),
+        Row(name='torque_limit', address=30, size=2, default=620),
+        Row(name='velocity_limit', address=32, size=4, default=17000),
+        Row(name='max_position_limit', address=36, size=4, default=250961),
+        Row(name='min_position_limit', address=40, size=4, default=None),
+        IndirectRow(name='external_port_mode', addresses=[range(44, 48)], size=1),
+        Row(name='shutdown', address=48, size=1, default=58),
+        IndirectRow(name='indirect_address', addresses=[range(49, 561, 2)], size=2)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=562, size=1, default=0),
+        Row(name='led_red', address=563, size=1, default=0),
+        Row(name='led_green', address=564, size=1, default=0),
+        Row(name='led_blue', address=565, size=1, default=0),
+        Row(name='velocity_i_gain', address=586, size=2, default=14),
+        Row(name='velocity_p_gain', address=588, size=2, default=399),
+        Row(name='position_p_gain', address=594, size=2, default=32),
+        Row(name='goal_position', address=596, size=4, default=None),
+        Row(name='goal_velocity', address=600, size=4, default=0),
+        Row(name='goal_torque', address=604, size=2, default=0),
+        Row(name='goal_acceleration', address=606, size=4, default=0),
+        Row(name='moving', address=610, size=1, default=None),
+        Row(name='present_position', address=611, size=4, default=None),
+        Row(name='present_velocity', address=615, size=4, default=None),
+        Row(name='present_current', address=621, size=2, default=None),
+        Row(name='present_input_voltage', address=623, size=2, default=None),
+        Row(name='present_temperature', address=625, size=1, default=None),
+        IndirectRow(name='external_port_data', addresses=[range(626, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(634, 890)], size=1),
+        Row(name='registered_instruction', address=890, size=1, default=0),
+        Row(name='status_return_level', address=891, size=1, default=2),
+        Row(name='hardware_error_status', address=892, size=1, default=0)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(H54_200_S500_R, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/h54_200_s500_r_a.py b/dynamixel/model/h54_200_s500_r_a.py
new file mode 100644
index 0000000..d42186b
--- /dev/null
+++ b/dynamixel/model/h54_200_s500_r_a.py
@@ -0,0 +1,71 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class H54_200_S500_R_A(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=54025),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='sencondary_id', address=12, size=1, default=255),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=20),
+        Row(name='temperature_limit', address=31, size=1, default=80),
+        Row(name='max_voltage_limit', address=32, size=2, default=350),
+        Row(name='min_voltage_limit', address=34, size=2, default=150),
+        Row(name='pwm_limit', address=36, size=2, default=2009),
+        Row(name='current_limit', address=38, size=2, default=22740),
+        Row(name='acceleration_limit', address=40, size=4, default=9982),
+        Row(name='velocity_limit', address=44, size=4, default=2900),
+        Row(name='max_position_limit', address=48, size=4, default=501433),
+        Row(name='min_position_limit', address=52, size=4, default=None),
+        IndirectRow(name='external_port_mode', addresses=[range(56, 60)], size=1),
+        Row(name='shutdown', address=63, size=1, default=52),
+        IndirectRow(name='indirect_address', addresses=[range(168, 424, 2)], size=2)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=512, size=1, default=0),
+        Row(name='led_red', address=513, size=1, default=0),
+        Row(name='led_green', address=514, size=1, default=0),
+        Row(name='led_blue', address=515, size=1, default=0),
+        Row(name='status_return_level', address=516, size=1, default=2),
+        Row(name='registered_instruction', address=517, size=1, default=0),
+        Row(name='hardware_error_status', address=518, size=1, default=0),
+        Row(name='velocity_i_gain', address=524, size=2, default=None),
+        Row(name='velocity_p_gain', address=526, size=2, default=None),
+        Row(name='position_d_gain', address=528, size=2, default=None),
+        Row(name='position_i_gain', address=530, size=2, default=None),
+        Row(name='position_p_gain', address=532, size=2, default=None),
+        Row(name='feedforward_2nd_gain', address=536, size=2, default=None),
+        Row(name='feedforward_1st_gain', address=538, size=2, default=None),
+        Row(name='bus_watchdog', address=546, size=1, default=None),
+        Row(name='goal_pwm', address=548, size=2, default=None),
+        Row(name='goal_current', address=550, size=2, default=None),
+        Row(name='goal_velocity', address=552, size=4, default=None),
+        Row(name='profile_acceleration', address=556, size=4, default=None),
+        Row(name='profile_velocity', address=560, size=4, default=None),
+        Row(name='goal_position', address=564, size=4, default=None),
+        Row(name='realtime_tick', address=568, size=2, default=None),
+        Row(name='moving', address=570, size=1, default=None),
+        Row(name='moving_status', address=571, size=1, default=None),
+        Row(name='present_pwm', address=572, size=2, default=None),
+        Row(name='present_current', address=574, size=2, default=None),
+        Row(name='present_velocity', address=576, size=4, default=None),
+        Row(name='present_position', address=580, size=4, default=None),
+        Row(name='velocity_trajectory', address=584, size=4, default=None),
+        Row(name='position_trajectory', address=588, size=4, default=None),
+        Row(name='present_input_voltage', address=592, size=2, default=None),
+        Row(name='present_temperature', address=594, size=1, default=None),
+        IndirectRow(name='external_port_data', addresses=[range(600, 608, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(634, 762)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(H54_200_S500_R_A, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/l42_10_s300_r.py b/dynamixel/model/l42_10_s300_r.py
new file mode 100644
index 0000000..e5b1888
--- /dev/null
+++ b/dynamixel/model/l42_10_s300_r.py
@@ -0,0 +1,56 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class L42_10_S300_R(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=35072),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='homing_offset', address=13, size=4, default=0),
+        Row(name='moving_threshold', address=17, size=4, default=10),
+        Row(name='temperature_limit', address=21, size=1, default=80),
+        Row(name='max_voltage_limit', address=22, size=2, default=400),
+        Row(name='min_voltage_limit', address=24, size=2, default=150),
+        Row(name='acceleration_limit', address=26, size=4, default=None),
+        Row(name='torque_limit', address=30, size=2, default=987),
+        Row(name='velocity_limit', address=32, size=4, default=None),
+        Row(name='max_position_limit', address=36, size=4, default=2048),
+        Row(name='min_position_limit', address=40, size=4, default=None),
+        IndirectRow(name='external_port_mode', addresses=[range(44, 48)], size=1),
+        Row(name='shutdown', address=48, size=1, default=30),
+        IndirectRow(name='indirect_address', addresses=[range(49, 561, 2)], size=2)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=562, size=1, default=0),
+        Row(name='led_red', address=563, size=1, default=0),
+        Row(name='led_green', address=564, size=1, default=0),
+        Row(name='led_blue', address=565, size=1, default=0),
+        Row(name='velocity_i_gain', address=586, size=2, default=40),
+        Row(name='velocity_p_gain', address=588, size=2, default=440),
+        Row(name='position_p_gain', address=594, size=2, default=64),
+        Row(name='goal_position', address=596, size=4, default=None),
+        Row(name='goal_velocity', address=600, size=4, default=0),
+        Row(name='goal_torque', address=604, size=2, default=0),
+        Row(name='goal_acceleration', address=606, size=4, default=0),
+        Row(name='moving', address=610, size=1, default=None),
+        Row(name='present_position', address=611, size=4, default=None),
+        Row(name='present_velocity', address=615, size=4, default=None),
+        Row(name='present_current', address=621, size=2, default=None),
+        Row(name='present_input_voltage', address=623, size=2, default=None),
+        Row(name='present_temperature', address=625, size=1, default=None),
+        IndirectRow(name='external_port_data', addresses=[range(626, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(634, 890)], size=1),
+        Row(name='registered_instruction', address=890, size=1, default=0),
+        Row(name='status_return_level', address=891, size=1, default=2),
+        Row(name='hardware_error_status', address=892, size=1, default=0)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(L42_10_S300_R, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/l54_30_s400_r.py b/dynamixel/model/l54_30_s400_r.py
new file mode 100644
index 0000000..c6a0355
--- /dev/null
+++ b/dynamixel/model/l54_30_s400_r.py
@@ -0,0 +1,56 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class L54_30_S400_R(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=37928),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='homing_offset', address=13, size=4, default=0),
+        Row(name='moving_threshold', address=17, size=4, default=50),
+        Row(name='temperature_limit', address=21, size=1, default=80),
+        Row(name='max_voltage_limit', address=22, size=2, default=400),
+        Row(name='min_voltage_limit', address=24, size=2, default=150),
+        Row(name='acceleration_limit', address=26, size=4, default=None),
+        Row(name='torque_limit', address=30, size=2, default=100),
+        Row(name='velocity_limit', address=32, size=4, default=9000),
+        Row(name='max_position_limit', address=36, size=4, default=144197),
+        Row(name='min_position_limit', address=40, size=4, default=None),
+        IndirectRow(name='external_port_mode', addresses=[range(44, 48)], size=1),
+        Row(name='shutdown', address=48, size=1, default=58),
+        IndirectRow(name='indirect_address', addresses=[range(49, 561, 2)], size=2)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=562, size=1, default=0),
+        Row(name='led_red', address=563, size=1, default=0),
+        Row(name='led_green', address=564, size=1, default=0),
+        Row(name='led_blue', address=565, size=1, default=0),
+        Row(name='velocity_i_gain', address=586, size=2, default=16),
+        Row(name='velocity_p_gain', address=588, size=2, default=412),
+        Row(name='position_p_gain', address=594, size=2, default=200),
+        Row(name='goal_position', address=596, size=4, default=None),
+        Row(name='goal_velocity', address=600, size=4, default=0),
+        Row(name='goal_torque', address=604, size=2, default=0),
+        Row(name='goal_acceleration', address=606, size=4, default=0),
+        Row(name='moving', address=610, size=1, default=None),
+        Row(name='present_position', address=611, size=4, default=None),
+        Row(name='present_velocity', address=615, size=4, default=None),
+        Row(name='present_current', address=621, size=2, default=None),
+        Row(name='present_input_voltage', address=623, size=2, default=None),
+        Row(name='present_temperature', address=625, size=1, default=None),
+        IndirectRow(name='external_port_data', addresses=[range(626, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(634, 890)], size=1),
+        Row(name='registered_instruction', address=890, size=1, default=0),
+        Row(name='status_return_level', address=891, size=1, default=2),
+        Row(name='hardware_error_status', address=892, size=1, default=0)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(L54_30_S400_R, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/l54_30_s500_r.py b/dynamixel/model/l54_30_s500_r.py
new file mode 100644
index 0000000..5ad457b
--- /dev/null
+++ b/dynamixel/model/l54_30_s500_r.py
@@ -0,0 +1,56 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class L54_30_S500_R(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=37896),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='homing_offset', address=13, size=4, default=0),
+        Row(name='moving_threshold', address=17, size=4, default=50),
+        Row(name='temperature_limit', address=21, size=1, default=80),
+        Row(name='max_voltage_limit', address=22, size=2, default=400),
+        Row(name='min_voltage_limit', address=24, size=2, default=150),
+        Row(name='acceleration_limit', address=26, size=4, default=None),
+        Row(name='torque_limit', address=30, size=2, default=100),
+        Row(name='velocity_limit', address=32, size=4, default=9000),
+        Row(name='max_position_limit', address=36, size=4, default=180692),
+        Row(name='min_position_limit', address=40, size=4, default=None),
+        IndirectRow(name='external_port_mode', addresses=[range(44, 48)], size=1),
+        Row(name='shutdown', address=48, size=1, default=58),
+        IndirectRow(name='indirect_address', addresses=[range(49, 561, 2)], size=2)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=562, size=1, default=0),
+        Row(name='led_red', address=563, size=1, default=0),
+        Row(name='led_green', address=564, size=1, default=0),
+        Row(name='led_blue', address=565, size=1, default=0),
+        Row(name='velocity_i_gain', address=586, size=2, default=16),
+        Row(name='velocity_p_gain', address=588, size=2, default=256),
+        Row(name='position_p_gain', address=594, size=2, default=32),
+        Row(name='goal_position', address=596, size=4, default=None),
+        Row(name='goal_velocity', address=600, size=4, default=0),
+        Row(name='goal_torque', address=604, size=2, default=0),
+        Row(name='goal_acceleration', address=606, size=4, default=0),
+        Row(name='moving', address=610, size=1, default=None),
+        Row(name='present_position', address=611, size=4, default=None),
+        Row(name='present_velocity', address=615, size=4, default=None),
+        Row(name='present_current', address=621, size=2, default=None),
+        Row(name='present_input_voltage', address=623, size=2, default=None),
+        Row(name='present_temperature', address=625, size=1, default=None),
+        IndirectRow(name='external_port_data', addresses=[range(626, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(634, 890)], size=1),
+        Row(name='registered_instruction', address=890, size=1, default=0),
+        Row(name='status_return_level', address=891, size=1, default=2),
+        Row(name='hardware_error_status', address=892, size=1, default=0)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(L54_30_S500_R, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/l54_50_s290_r.py b/dynamixel/model/l54_50_s290_r.py
new file mode 100644
index 0000000..0d301b4
--- /dev/null
+++ b/dynamixel/model/l54_50_s290_r.py
@@ -0,0 +1,56 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class L54_50_S290_R(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=38176),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='homing_offset', address=13, size=4, default=0),
+        Row(name='moving_threshold', address=17, size=4, default=50),
+        Row(name='temperature_limit', address=21, size=1, default=80),
+        Row(name='max_voltage_limit', address=22, size=2, default=400),
+        Row(name='min_voltage_limit', address=24, size=2, default=150),
+        Row(name='acceleration_limit', address=26, size=4, default=None),
+        Row(name='torque_limit', address=30, size=2, default=120),
+        Row(name='velocity_limit', address=32, size=4, default=8000),
+        Row(name='max_position_limit', address=36, size=4, default=103846),
+        Row(name='min_position_limit', address=40, size=4, default=None),
+        IndirectRow(name='external_port_mode', addresses=[range(44, 48)], size=1),
+        Row(name='shutdown', address=48, size=1, default=58),
+        IndirectRow(name='indirect_address', addresses=[range(49, 561, 2)], size=2)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=562, size=1, default=0),
+        Row(name='led_red', address=563, size=1, default=0),
+        Row(name='led_green', address=564, size=1, default=0),
+        Row(name='led_blue', address=565, size=1, default=0),
+        Row(name='velocity_i_gain', address=586, size=2, default=16),
+        Row(name='velocity_p_gain', address=588, size=2, default=412),
+        Row(name='position_p_gain', address=594, size=2, default=250),
+        Row(name='goal_position', address=596, size=4, default=None),
+        Row(name='goal_velocity', address=600, size=4, default=0),
+        Row(name='goal_torque', address=604, size=2, default=0),
+        Row(name='goal_acceleration', address=606, size=4, default=0),
+        Row(name='moving', address=610, size=1, default=None),
+        Row(name='present_position', address=611, size=4, default=None),
+        Row(name='present_velocity', address=615, size=4, default=None),
+        Row(name='present_current', address=621, size=2, default=None),
+        Row(name='present_input_voltage', address=623, size=2, default=None),
+        Row(name='present_temperature', address=625, size=1, default=None),
+        IndirectRow(name='external_port_data', addresses=[range(626, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(634, 890)], size=1),
+        Row(name='registered_instruction', address=890, size=1, default=0),
+        Row(name='status_return_level', address=891, size=1, default=2),
+        Row(name='hardware_error_status', address=892, size=1, default=0)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(L54_50_S290_R, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/l54_50_s500_r.py b/dynamixel/model/l54_50_s500_r.py
new file mode 100644
index 0000000..c047b61
--- /dev/null
+++ b/dynamixel/model/l54_50_s500_r.py
@@ -0,0 +1,56 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class L54_50_S500_R(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=38152),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='homing_offset', address=13, size=4, default=0),
+        Row(name='moving_threshold', address=17, size=4, default=50),
+        Row(name='temperature_limit', address=21, size=1, default=80),
+        Row(name='max_voltage_limit', address=22, size=2, default=400),
+        Row(name='min_voltage_limit', address=24, size=2, default=150),
+        Row(name='acceleration_limit', address=26, size=4, default=None),
+        Row(name='torque_limit', address=30, size=2, default=120),
+        Row(name='velocity_limit', address=32, size=4, default=8000),
+        Row(name='max_position_limit', address=36, size=4, default=180692),
+        Row(name='min_position_limit', address=40, size=4, default=None),
+        IndirectRow(name='external_port_mode', addresses=[range(44, 48)], size=1),
+        Row(name='shutdown', address=48, size=1, default=58),
+        IndirectRow(name='indirect_address', addresses=[range(49, 561, 2)], size=2)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=562, size=1, default=0),
+        Row(name='led_red', address=563, size=1, default=0),
+        Row(name='led_green', address=564, size=1, default=0),
+        Row(name='led_blue', address=565, size=1, default=0),
+        Row(name='velocity_i_gain', address=586, size=2, default=16),
+        Row(name='velocity_p_gain', address=588, size=2, default=256),
+        Row(name='position_p_gain', address=594, size=2, default=32),
+        Row(name='goal_position', address=596, size=4, default=None),
+        Row(name='goal_velocity', address=600, size=4, default=0),
+        Row(name='goal_torque', address=604, size=2, default=0),
+        Row(name='goal_acceleration', address=606, size=4, default=0),
+        Row(name='moving', address=610, size=1, default=None),
+        Row(name='present_position', address=611, size=4, default=None),
+        Row(name='present_velocity', address=615, size=4, default=None),
+        Row(name='present_current', address=621, size=2, default=None),
+        Row(name='present_input_voltage', address=623, size=2, default=None),
+        Row(name='present_temperature', address=625, size=1, default=None),
+        IndirectRow(name='external_port_data', addresses=[range(626, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(634, 890)], size=1),
+        Row(name='registered_instruction', address=890, size=1, default=0),
+        Row(name='status_return_level', address=891, size=1, default=2),
+        Row(name='hardware_error_status', address=892, size=1, default=0)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(L54_50_S500_R, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/m42_10_s260_r.py b/dynamixel/model/m42_10_s260_r.py
new file mode 100644
index 0000000..7b73819
--- /dev/null
+++ b/dynamixel/model/m42_10_s260_r.py
@@ -0,0 +1,56 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class M42_10_S260_R(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=43288),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='homing_offset', address=13, size=4, default=0),
+        Row(name='moving_threshold', address=17, size=4, default=50),
+        Row(name='temperature_limit', address=21, size=1, default=80),
+        Row(name='max_voltage_limit', address=22, size=2, default=400),
+        Row(name='min_voltage_limit', address=24, size=2, default=150),
+        Row(name='acceleration_limit', address=26, size=4, default=None),
+        Row(name='torque_limit', address=30, size=2, default=300),
+        Row(name='velocity_limit', address=32, size=4, default=8000),
+        Row(name='max_position_limit', address=36, size=4, default=131593),
+        Row(name='min_position_limit', address=40, size=4, default=None),
+        IndirectRow(name='external_port_mode', addresses=[range(44, 48)], size=1),
+        Row(name='shutdown', address=48, size=1, default=58),
+        IndirectRow(name='indirect_address', addresses=[range(49, 561, 2)], size=2)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=562, size=1, default=0),
+        Row(name='led_red', address=563, size=1, default=0),
+        Row(name='led_green', address=564, size=1, default=0),
+        Row(name='led_blue', address=565, size=1, default=0),
+        Row(name='velocity_i_gain', address=586, size=2, default=72),
+        Row(name='velocity_p_gain', address=588, size=2, default=520),
+        Row(name='position_p_gain', address=594, size=2, default=32),
+        Row(name='goal_position', address=596, size=4, default=None),
+        Row(name='goal_velocity', address=600, size=4, default=0),
+        Row(name='goal_torque', address=604, size=2, default=0),
+        Row(name='goal_acceleration', address=606, size=4, default=0),
+        Row(name='moving', address=610, size=1, default=None),
+        Row(name='present_position', address=611, size=4, default=None),
+        Row(name='present_velocity', address=615, size=4, default=None),
+        Row(name='present_current', address=621, size=2, default=None),
+        Row(name='present_input_voltage', address=623, size=2, default=None),
+        Row(name='present_temperature', address=625, size=1, default=None),
+        IndirectRow(name='external_port_data', addresses=[range(626, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(634, 890)], size=1),
+        Row(name='registered_instruction', address=890, size=1, default=0),
+        Row(name='status_return_level', address=891, size=1, default=2),
+        Row(name='hardware_error_status', address=892, size=1, default=0)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(M42_10_S260_R, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/m42_10_s260_r_a.py b/dynamixel/model/m42_10_s260_r_a.py
new file mode 100644
index 0000000..a867531
--- /dev/null
+++ b/dynamixel/model/m42_10_s260_r_a.py
@@ -0,0 +1,71 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class M42_10_S260_R_A(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=43289),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='sencondary_id', address=12, size=1, default=255),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=20),
+        Row(name='temperature_limit', address=31, size=1, default=80),
+        Row(name='max_voltage_limit', address=32, size=2, default=300),
+        Row(name='min_voltage_limit', address=34, size=2, default=150),
+        Row(name='pwm_limit', address=36, size=2, default=2009),
+        Row(name='current_limit', address=38, size=2, default=1461),
+        Row(name='acceleration_limit', address=40, size=4, default=10867),
+        Row(name='velocity_limit', address=44, size=4, default=2600),
+        Row(name='max_position_limit', address=48, size=4, default=262931),
+        Row(name='min_position_limit', address=52, size=4, default=None),
+        IndirectRow(name='external_port_mode', addresses=[range(56, 60)], size=1),
+        Row(name='shutdown', address=63, size=1, default=52),
+        IndirectRow(name='indirect_address', addresses=[range(168, 424, 2)], size=2)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=512, size=1, default=0),
+        Row(name='led_red', address=513, size=1, default=0),
+        Row(name='led_green', address=514, size=1, default=0),
+        Row(name='led_blue', address=515, size=1, default=0),
+        Row(name='status_return_level', address=516, size=1, default=2),
+        Row(name='registered_instruction', address=517, size=1, default=0),
+        Row(name='hardware_error_status', address=518, size=1, default=0),
+        Row(name='velocity_i_gain', address=524, size=2, default=None),
+        Row(name='velocity_p_gain', address=526, size=2, default=None),
+        Row(name='position_d_gain', address=528, size=2, default=None),
+        Row(name='position_i_gain', address=530, size=2, default=None),
+        Row(name='position_p_gain', address=532, size=2, default=None),
+        Row(name='feedforward_2nd_gain', address=536, size=2, default=None),
+        Row(name='feedforward_1st_gain', address=538, size=2, default=None),
+        Row(name='bus_watchdog', address=546, size=1, default=None),
+        Row(name='goal_pwm', address=548, size=2, default=None),
+        Row(name='goal_current', address=550, size=2, default=None),
+        Row(name='goal_velocity', address=552, size=4, default=None),
+        Row(name='profile_acceleration', address=556, size=4, default=None),
+        Row(name='profile_velocity', address=560, size=4, default=None),
+        Row(name='goal_position', address=564, size=4, default=None),
+        Row(name='realtime_tick', address=568, size=2, default=None),
+        Row(name='moving', address=570, size=1, default=None),
+        Row(name='moving_status', address=571, size=1, default=None),
+        Row(name='present_pwm', address=572, size=2, default=None),
+        Row(name='present_current', address=574, size=2, default=None),
+        Row(name='present_velocity', address=576, size=4, default=None),
+        Row(name='present_position', address=580, size=4, default=None),
+        Row(name='velocity_trajectory', address=584, size=4, default=None),
+        Row(name='position_trajectory', address=588, size=4, default=None),
+        Row(name='present_input_voltage', address=592, size=2, default=None),
+        Row(name='present_temperature', address=594, size=1, default=None),
+        IndirectRow(name='external_port_data', addresses=[range(600, 608, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(634, 762)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(M42_10_S260_R_A, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/m54_40_s250_r.py b/dynamixel/model/m54_40_s250_r.py
new file mode 100644
index 0000000..906479c
--- /dev/null
+++ b/dynamixel/model/m54_40_s250_r.py
@@ -0,0 +1,56 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class M54_40_S250_R(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=46096),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='homing_offset', address=13, size=4, default=0),
+        Row(name='moving_threshold', address=17, size=4, default=50),
+        Row(name='temperature_limit', address=21, size=1, default=80),
+        Row(name='max_voltage_limit', address=22, size=2, default=400),
+        Row(name='min_voltage_limit', address=24, size=2, default=150),
+        Row(name='acceleration_limit', address=26, size=4, default=None),
+        Row(name='torque_limit', address=30, size=2, default=120),
+        Row(name='velocity_limit', address=32, size=4, default=8000),
+        Row(name='max_position_limit', address=36, size=4, default=125708),
+        Row(name='min_position_limit', address=40, size=4, default=None),
+        IndirectRow(name='external_port_mode', addresses=[range(44, 48)], size=1),
+        Row(name='shutdown', address=48, size=1, default=58),
+        IndirectRow(name='indirect_address', addresses=[range(49, 561, 2)], size=2)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=562, size=1, default=0),
+        Row(name='led_red', address=563, size=1, default=0),
+        Row(name='led_green', address=564, size=1, default=0),
+        Row(name='led_blue', address=565, size=1, default=0),
+        Row(name='velocity_i_gain', address=586, size=2, default=16),
+        Row(name='velocity_p_gain', address=588, size=2, default=256),
+        Row(name='position_p_gain', address=594, size=2, default=32),
+        Row(name='goal_position', address=596, size=4, default=None),
+        Row(name='goal_velocity', address=600, size=4, default=0),
+        Row(name='goal_torque', address=604, size=2, default=0),
+        Row(name='goal_acceleration', address=606, size=4, default=0),
+        Row(name='moving', address=610, size=1, default=None),
+        Row(name='present_position', address=611, size=4, default=None),
+        Row(name='present_velocity', address=615, size=4, default=None),
+        Row(name='present_current', address=621, size=2, default=None),
+        Row(name='present_input_voltage', address=623, size=2, default=None),
+        Row(name='present_temperature', address=625, size=1, default=None),
+        IndirectRow(name='external_port_data', addresses=[range(626, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(634, 890)], size=1),
+        Row(name='registered_instruction', address=890, size=1, default=0),
+        Row(name='status_return_level', address=891, size=1, default=2),
+        Row(name='hardware_error_status', address=892, size=1, default=0)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(M54_40_S250_R, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/m54_40_s250_r_a.py b/dynamixel/model/m54_40_s250_r_a.py
new file mode 100644
index 0000000..a8d8702
--- /dev/null
+++ b/dynamixel/model/m54_40_s250_r_a.py
@@ -0,0 +1,71 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class M54_40_S250_R_A(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=46097),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='sencondary_id', address=12, size=1, default=255),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=20),
+        Row(name='temperature_limit', address=31, size=1, default=80),
+        Row(name='max_voltage_limit', address=32, size=2, default=350),
+        Row(name='min_voltage_limit', address=34, size=2, default=150),
+        Row(name='pwm_limit', address=36, size=2, default=2009),
+        Row(name='current_limit', address=38, size=2, default=4470),
+        Row(name='acceleration_limit', address=40, size=4, default=11037),
+        Row(name='velocity_limit', address=44, size=4, default=2840),
+        Row(name='max_position_limit', address=48, size=4, default=251173),
+        Row(name='min_position_limit', address=52, size=4, default=None),
+        IndirectRow(name='external_port_mode', addresses=[range(56, 60)], size=1),
+        Row(name='shutdown', address=63, size=1, default=52),
+        IndirectRow(name='indirect_address', addresses=[range(168, 424, 2)], size=2)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=512, size=1, default=0),
+        Row(name='led_red', address=513, size=1, default=0),
+        Row(name='led_green', address=514, size=1, default=0),
+        Row(name='led_blue', address=515, size=1, default=0),
+        Row(name='status_return_level', address=516, size=1, default=2),
+        Row(name='registered_instruction', address=517, size=1, default=0),
+        Row(name='hardware_error_status', address=518, size=1, default=0),
+        Row(name='velocity_i_gain', address=524, size=2, default=None),
+        Row(name='velocity_p_gain', address=526, size=2, default=None),
+        Row(name='position_d_gain', address=528, size=2, default=None),
+        Row(name='position_i_gain', address=530, size=2, default=None),
+        Row(name='position_p_gain', address=532, size=2, default=None),
+        Row(name='feedforward_2nd_gain', address=536, size=2, default=None),
+        Row(name='feedforward_1st_gain', address=538, size=2, default=None),
+        Row(name='bus_watchdog', address=546, size=1, default=None),
+        Row(name='goal_pwm', address=548, size=2, default=None),
+        Row(name='goal_current', address=550, size=2, default=None),
+        Row(name='goal_velocity', address=552, size=4, default=None),
+        Row(name='profile_acceleration', address=556, size=4, default=None),
+        Row(name='profile_velocity', address=560, size=4, default=None),
+        Row(name='goal_position', address=564, size=4, default=None),
+        Row(name='realtime_tick', address=568, size=2, default=None),
+        Row(name='moving', address=570, size=1, default=None),
+        Row(name='moving_status', address=571, size=1, default=None),
+        Row(name='present_pwm', address=572, size=2, default=None),
+        Row(name='present_current', address=574, size=2, default=None),
+        Row(name='present_velocity', address=576, size=4, default=None),
+        Row(name='present_position', address=580, size=4, default=None),
+        Row(name='velocity_trajectory', address=584, size=4, default=None),
+        Row(name='position_trajectory', address=588, size=4, default=None),
+        Row(name='present_input_voltage', address=592, size=2, default=None),
+        Row(name='present_temperature', address=594, size=1, default=None),
+        IndirectRow(name='external_port_data', addresses=[range(600, 608, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(634, 762)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(M54_40_S250_R_A, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/m54_60_s250_r.py b/dynamixel/model/m54_60_s250_r.py
new file mode 100644
index 0000000..6a3136f
--- /dev/null
+++ b/dynamixel/model/m54_60_s250_r.py
@@ -0,0 +1,56 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class M54_60_S250_R(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=46352),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='homing_offset', address=13, size=4, default=0),
+        Row(name='moving_threshold', address=17, size=4, default=50),
+        Row(name='temperature_limit', address=21, size=1, default=80),
+        Row(name='max_voltage_limit', address=22, size=2, default=400),
+        Row(name='min_voltage_limit', address=24, size=2, default=150),
+        Row(name='acceleration_limit', address=26, size=4, default=None),
+        Row(name='torque_limit', address=30, size=2, default=180),
+        Row(name='velocity_limit', address=32, size=4, default=8000),
+        Row(name='max_position_limit', address=36, size=4, default=125708),
+        Row(name='min_position_limit', address=40, size=4, default=None),
+        IndirectRow(name='external_port_mode', addresses=[range(44, 48)], size=1),
+        Row(name='shutdown', address=48, size=1, default=58),
+        IndirectRow(name='indirect_address', addresses=[range(49, 561, 2)], size=2)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=562, size=1, default=0),
+        Row(name='led_red', address=563, size=1, default=0),
+        Row(name='led_green', address=564, size=1, default=0),
+        Row(name='led_blue', address=565, size=1, default=0),
+        Row(name='velocity_i_gain', address=586, size=2, default=16),
+        Row(name='velocity_p_gain', address=588, size=2, default=256),
+        Row(name='position_p_gain', address=594, size=2, default=32),
+        Row(name='goal_position', address=596, size=4, default=None),
+        Row(name='goal_velocity', address=600, size=4, default=0),
+        Row(name='goal_torque', address=604, size=2, default=0),
+        Row(name='goal_acceleration', address=606, size=4, default=0),
+        Row(name='moving', address=610, size=1, default=None),
+        Row(name='present_position', address=611, size=4, default=None),
+        Row(name='present_velocity', address=615, size=4, default=None),
+        Row(name='present_current', address=621, size=2, default=None),
+        Row(name='present_input_voltage', address=623, size=2, default=None),
+        Row(name='present_temperature', address=625, size=1, default=None),
+        IndirectRow(name='external_port_data', addresses=[range(626, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(634, 890)], size=1),
+        Row(name='registered_instruction', address=890, size=1, default=0),
+        Row(name='status_return_level', address=891, size=1, default=2),
+        Row(name='hardware_error_status', address=892, size=1, default=0)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(M54_60_S250_R, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/m54_60_s250_r_a.py b/dynamixel/model/m54_60_s250_r_a.py
new file mode 100644
index 0000000..4b837af
--- /dev/null
+++ b/dynamixel/model/m54_60_s250_r_a.py
@@ -0,0 +1,71 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class M54_60_S250_R_A(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=46353),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='sencondary_id', address=12, size=1, default=255),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=50),
+        Row(name='temperature_limit', address=31, size=1, default=80),
+        Row(name='max_voltage_limit', address=32, size=2, default=350),
+        Row(name='min_voltage_limit', address=34, size=2, default=150),
+        Row(name='pwm_limit', address=36, size=2, default=2009),
+        Row(name='current_limit', address=38, size=2, default=7980),
+        Row(name='acceleration_limit', address=40, size=4, default=11145),
+        Row(name='velocity_limit', address=44, size=4, default=2830),
+        Row(name='max_position_limit', address=48, size=4, default=251173),
+        Row(name='min_position_limit', address=52, size=4, default=None),
+        IndirectRow(name='external_port_mode', addresses=[range(56, 60)], size=1),
+        Row(name='shutdown', address=63, size=1, default=52),
+        IndirectRow(name='indirect_address', addresses=[range(168, 424, 2)], size=2)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=512, size=1, default=0),
+        Row(name='led_red', address=513, size=1, default=0),
+        Row(name='led_green', address=514, size=1, default=0),
+        Row(name='led_blue', address=515, size=1, default=0),
+        Row(name='status_return_level', address=516, size=1, default=2),
+        Row(name='registered_instruction', address=517, size=1, default=0),
+        Row(name='hardware_error_status', address=518, size=1, default=0),
+        Row(name='velocity_i_gain', address=524, size=2, default=None),
+        Row(name='velocity_p_gain', address=526, size=2, default=None),
+        Row(name='position_d_gain', address=528, size=2, default=None),
+        Row(name='position_i_gain', address=530, size=2, default=None),
+        Row(name='position_p_gain', address=532, size=2, default=None),
+        Row(name='feedforward_2nd_gain', address=536, size=2, default=None),
+        Row(name='feedforward_1st_gain', address=538, size=2, default=None),
+        Row(name='bus_watchdog', address=546, size=1, default=None),
+        Row(name='goal_pwm', address=548, size=2, default=None),
+        Row(name='goal_current', address=550, size=2, default=None),
+        Row(name='goal_velocity', address=552, size=4, default=None),
+        Row(name='profile_acceleration', address=556, size=4, default=None),
+        Row(name='profile_velocity', address=560, size=4, default=None),
+        Row(name='goal_position', address=564, size=4, default=None),
+        Row(name='realtime_tick', address=568, size=2, default=None),
+        Row(name='moving', address=570, size=1, default=None),
+        Row(name='moving_status', address=571, size=1, default=None),
+        Row(name='present_pwm', address=572, size=2, default=None),
+        Row(name='present_current', address=574, size=2, default=None),
+        Row(name='present_velocity', address=576, size=4, default=None),
+        Row(name='present_position', address=580, size=4, default=None),
+        Row(name='velocity_trajectory', address=584, size=4, default=None),
+        Row(name='position_trajectory', address=588, size=4, default=None),
+        Row(name='present_input_voltage', address=592, size=2, default=None),
+        Row(name='present_temperature', address=594, size=1, default=None),
+        IndirectRow(name='external_port_data', addresses=[range(600, 608, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(634, 762)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(M54_60_S250_R_A, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/mx_106t_r.py b/dynamixel/model/mx_106t_r.py
new file mode 100644
index 0000000..93c1c1f
--- /dev/null
+++ b/dynamixel/model/mx_106t_r.py
@@ -0,0 +1,53 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class MX_106T_R(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=320),
+        Row(name='firmware_version', address=2, size=1, default=None),
+        Row(name='id', address=3, size=1, default=1),
+        Row(name='baud_rate', address=4, size=1, default=34),
+        Row(name='return_delay_time', address=5, size=1, default=250),
+        Row(name='cw_angle_limit', address=6, size=2, default=0),
+        Row(name='ccw_angle_limit', address=8, size=2, default=4095),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='temperature_limit', address=11, size=1, default=80),
+        Row(name='min_voltage_limit', address=12, size=1, default=60),
+        Row(name='max_voltage_limit', address=13, size=1, default=160),
+        Row(name='max_torque', address=14, size=2, default=1023),
+        Row(name='status_return_level', address=16, size=1, default=2),
+        Row(name='alarm_led', address=17, size=1, default=36),
+        Row(name='shutdown', address=18, size=1, default=36),
+        Row(name='multi_turn_offset', address=20, size=2, default=0),
+        Row(name='resolution_divider', address=22, size=1, default=1)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=24, size=1, default=0),
+        Row(name='led', address=25, size=1, default=0),
+        Row(name='d_gain', address=26, size=1, default=0),
+        Row(name='i_gain', address=27, size=1, default=0),
+        Row(name='p_gain', address=28, size=1, default=32),
+        Row(name='goal_position', address=30, size=2, default=None),
+        Row(name='moving_speed', address=32, size=2, default=None),
+        Row(name='torque_limit', address=34, size=2, default=None),
+        Row(name='present_position', address=36, size=2, default=None),
+        Row(name='present_speed', address=38, size=2, default=None),
+        Row(name='present_load', address=40, size=2, default=None),
+        Row(name='present_voltage', address=42, size=1, default=None),
+        Row(name='present_temperature', address=43, size=1, default=None),
+        Row(name='registered', address=44, size=1, default=0),
+        Row(name='moving', address=46, size=1, default=0),
+        Row(name='lock', address=47, size=1, default=0),
+        Row(name='punch', address=48, size=2, default=0),
+        Row(name='realtime_tick', address=50, size=2, default=0),
+        Row(name='current', address=68, size=2, default=0),
+        Row(name='torque_ctrl_mode_enable', address=70, size=1, default=0),
+        Row(name='goal_torque', address=71, size=2, default=0),
+        Row(name='goal_acceleration', address=73, size=1, default=0)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol1
+
+    def __init__(self, id):
+        super(MX_106T_R, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/mx_106t_r_2.0.py b/dynamixel/model/mx_106t_r_2.0.py
new file mode 100644
index 0000000..fccc138
--- /dev/null
+++ b/dynamixel/model/mx_106t_r_2.0.py
@@ -0,0 +1,68 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class MX_106T_R_2.0(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=321),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='secondary_id', address=12, size=1, default=255),
+        Row(name='protocol_type', address=13, size=1, default=2),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=10),
+        Row(name='temperature_limit', address=31, size=1, default=80),
+        Row(name='max_voltage_limit', address=32, size=2, default=160),
+        Row(name='min_voltage_limit', address=34, size=2, default=95),
+        Row(name='pwm_limit', address=36, size=2, default=885),
+        Row(name='current_limit', address=38, size=2, default=2047),
+        Row(name='acceleration_limit', address=40, size=4, default=32767),
+        Row(name='velocity_limit', address=44, size=4, default=210),
+        Row(name='max_position_limit', address=48, size=4, default=4095),
+        Row(name='min_position_limit', address=52, size=4, default=0),
+        Row(name='shutdown', address=63, size=1, default=52)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=64, size=1, default=0),
+        Row(name='led', address=65, size=1, default=0),
+        Row(name='status_return_level', address=68, size=1, default=2),
+        Row(name='registered_instruction', address=69, size=1, default=0),
+        Row(name='hardware_error_status', address=70, size=1, default=0),
+        Row(name='velocity_i_gain', address=76, size=2, default=1920),
+        Row(name='velocity_p_gain', address=78, size=2, default=100),
+        Row(name='position_d_gain', address=80, size=2, default=0),
+        Row(name='position_i_gain', address=82, size=2, default=0),
+        Row(name='position_p_gain', address=84, size=2, default=850),
+        Row(name='feedforward_2nd_gain', address=88, size=2, default=0),
+        Row(name='feedforward_1st_gain', address=90, size=2, default=0),
+        Row(name='bus_watchdog', address=98, size=1, default=0),
+        Row(name='goal_pwm', address=100, size=2, default=None),
+        Row(name='goal_current', address=102, size=2, default=None),
+        Row(name='goal_velocity', address=104, size=4, default=None),
+        Row(name='profile_acceleration', address=108, size=4, default=0),
+        Row(name='profile_velocity', address=112, size=4, default=0),
+        Row(name='goal_position', address=116, size=4, default=None),
+        Row(name='realtime_tick', address=120, size=2, default=None),
+        Row(name='moving', address=122, size=1, default=0),
+        Row(name='moving_status', address=123, size=1, default=0),
+        Row(name='present_pwm', address=124, size=2, default=None),
+        Row(name='present_current', address=126, size=2, default=None),
+        Row(name='present_velocity', address=128, size=4, default=None),
+        Row(name='present_position', address=132, size=4, default=None),
+        Row(name='velocity_trajectory', address=136, size=4, default=None),
+        Row(name='position_trajectory', address=140, size=4, default=None),
+        Row(name='present_input_voltage', address=144, size=2, default=None),
+        Row(name='present_temperature', address=146, size=1, default=None),
+        IndirectRow(name='indirect_address', addresses=[range(168, 224, 2), range(578, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(224, 252), range(634, 662)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(MX_106T_R_2.0, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/mx_12w.py b/dynamixel/model/mx_12w.py
new file mode 100644
index 0000000..b455db0
--- /dev/null
+++ b/dynamixel/model/mx_12w.py
@@ -0,0 +1,49 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class MX_12W(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=360),
+        Row(name='firmware_version', address=2, size=1, default=None),
+        Row(name='id', address=3, size=1, default=1),
+        Row(name='baud_rate', address=4, size=1, default=1),
+        Row(name='return_delay_time', address=5, size=1, default=250),
+        Row(name='cw_angle_limit', address=6, size=2, default=0),
+        Row(name='ccw_angle_limit', address=8, size=2, default=4095),
+        Row(name='temperature_limit', address=11, size=1, default=70),
+        Row(name='min_voltage_limit', address=12, size=1, default=60),
+        Row(name='max_voltage_limit', address=13, size=1, default=160),
+        Row(name='max_torque', address=14, size=2, default=1023),
+        Row(name='status_return_level', address=16, size=1, default=2),
+        Row(name='alarm_led', address=17, size=1, default=36),
+        Row(name='shutdown', address=18, size=1, default=36),
+        Row(name='multi_turn_offset', address=20, size=2, default=0),
+        Row(name='resolution_divider', address=22, size=1, default=1)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=24, size=1, default=0),
+        Row(name='led', address=25, size=1, default=0),
+        Row(name='d_gain', address=26, size=1, default=8),
+        Row(name='i_gain', address=27, size=1, default=0),
+        Row(name='p_gain', address=28, size=1, default=8),
+        Row(name='goal_position', address=30, size=2, default=None),
+        Row(name='moving_speed', address=32, size=2, default=None),
+        Row(name='torque_limit', address=34, size=2, default=None),
+        Row(name='present_position', address=36, size=2, default=None),
+        Row(name='present_speed', address=38, size=2, default=None),
+        Row(name='present_load', address=40, size=2, default=None),
+        Row(name='present_voltage', address=42, size=1, default=None),
+        Row(name='present_temperature', address=43, size=1, default=None),
+        Row(name='registered', address=44, size=1, default=0),
+        Row(name='moving', address=46, size=1, default=0),
+        Row(name='lock', address=47, size=1, default=0),
+        Row(name='punch', address=48, size=2, default=32),
+        Row(name='realtime_tick', address=50, size=2, default=0),
+        Row(name='goal_acceleration', address=73, size=1, default=0)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol1
+
+    def __init__(self, id):
+        super(MX_12W, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/mx_28t_r_at_ar.py b/dynamixel/model/mx_28t_r_at_ar.py
new file mode 100644
index 0000000..cba2d3a
--- /dev/null
+++ b/dynamixel/model/mx_28t_r_at_ar.py
@@ -0,0 +1,49 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class MX_28T_R_AT_AR(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=29),
+        Row(name='firmware_version', address=2, size=1, default=None),
+        Row(name='id', address=3, size=1, default=1),
+        Row(name='baud_rate', address=4, size=1, default=34),
+        Row(name='return_delay_time', address=5, size=1, default=250),
+        Row(name='cw_angle_limit', address=6, size=2, default=0),
+        Row(name='ccw_angle_limit', address=8, size=2, default=4095),
+        Row(name='temperature_limit', address=11, size=1, default=80),
+        Row(name='min_voltage_limit', address=12, size=1, default=60),
+        Row(name='max_voltage_limit', address=13, size=1, default=160),
+        Row(name='max_torque', address=14, size=2, default=1023),
+        Row(name='status_return_level', address=16, size=1, default=2),
+        Row(name='alarm_led', address=17, size=1, default=36),
+        Row(name='shutdown', address=18, size=1, default=36),
+        Row(name='multi_turn_offset', address=20, size=2, default=0),
+        Row(name='resolution_divider', address=22, size=1, default=1)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=24, size=1, default=0),
+        Row(name='led', address=25, size=1, default=0),
+        Row(name='d_gain', address=26, size=1, default=0),
+        Row(name='i_gain', address=27, size=1, default=0),
+        Row(name='p_gain', address=28, size=1, default=32),
+        Row(name='goal_position', address=30, size=2, default=None),
+        Row(name='moving_speed', address=32, size=2, default=None),
+        Row(name='torque_limit', address=34, size=2, default=None),
+        Row(name='present_position', address=36, size=2, default=None),
+        Row(name='present_speed', address=38, size=2, default=None),
+        Row(name='present_load', address=40, size=2, default=None),
+        Row(name='present_voltage', address=42, size=1, default=None),
+        Row(name='present_temperature', address=43, size=1, default=None),
+        Row(name='registered', address=44, size=1, default=0),
+        Row(name='moving', address=46, size=1, default=0),
+        Row(name='lock', address=47, size=1, default=0),
+        Row(name='punch', address=48, size=2, default=0),
+        Row(name='realtime_tick', address=50, size=2, default=0),
+        Row(name='goal_acceleration', address=73, size=1, default=0)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol1
+
+    def __init__(self, id):
+        super(MX_28T_R_AT_AR, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/mx_28t_r_at_ar_2.0.py b/dynamixel/model/mx_28t_r_at_ar_2.0.py
new file mode 100644
index 0000000..6ceaaa6
--- /dev/null
+++ b/dynamixel/model/mx_28t_r_at_ar_2.0.py
@@ -0,0 +1,66 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class MX_28T_R_AT_AR_2.0(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=30),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='secondary_id', address=12, size=1, default=255),
+        Row(name='protocol_type', address=13, size=1, default=2),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=10),
+        Row(name='temperature_limit', address=31, size=1, default=80),
+        Row(name='max_voltage_limit', address=32, size=2, default=160),
+        Row(name='min_voltage_limit', address=34, size=2, default=95),
+        Row(name='pwm_limit', address=36, size=2, default=885),
+        Row(name='acceleration_limit', address=40, size=4, default=32767),
+        Row(name='velocity_limit', address=44, size=4, default=230),
+        Row(name='max_position_limit', address=48, size=4, default=4095),
+        Row(name='min_position_limit', address=52, size=4, default=0),
+        Row(name='shutdown', address=63, size=1, default=52)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=64, size=1, default=0),
+        Row(name='led', address=65, size=1, default=0),
+        Row(name='status_return_level', address=68, size=1, default=2),
+        Row(name='registered_instruction', address=69, size=1, default=0),
+        Row(name='hardware_error_status', address=70, size=1, default=0),
+        Row(name='velocity_i_gain', address=76, size=2, default=1920),
+        Row(name='velocity_p_gain', address=78, size=2, default=100),
+        Row(name='position_d_gain', address=80, size=2, default=0),
+        Row(name='position_i_gain', address=82, size=2, default=0),
+        Row(name='position_p_gain', address=84, size=2, default=850),
+        Row(name='feedforward_2nd_gain', address=88, size=2, default=0),
+        Row(name='feedforward_1st_gain', address=90, size=2, default=0),
+        Row(name='bus_watchdog', address=98, size=1, default=0),
+        Row(name='goal_pwm', address=100, size=2, default=None),
+        Row(name='goal_velocity', address=104, size=4, default=None),
+        Row(name='profile_acceleration', address=108, size=4, default=0),
+        Row(name='profile_velocity', address=112, size=4, default=0),
+        Row(name='goal_position', address=116, size=4, default=None),
+        Row(name='realtime_tick', address=120, size=2, default=None),
+        Row(name='moving', address=122, size=1, default=0),
+        Row(name='moving_status', address=123, size=1, default=0),
+        Row(name='present_pwm', address=124, size=2, default=None),
+        Row(name='present_load', address=126, size=2, default=None),
+        Row(name='present_velocity', address=128, size=4, default=None),
+        Row(name='present_position', address=132, size=4, default=None),
+        Row(name='velocity_trajectory', address=136, size=4, default=None),
+        Row(name='position_trajectory', address=140, size=4, default=None),
+        Row(name='present_input_voltage', address=144, size=2, default=None),
+        Row(name='present_temperature', address=146, size=1, default=None),
+        IndirectRow(name='indirect_address', addresses=[range(168, 224, 2), range(578, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(224, 252), range(634, 662)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(MX_28T_R_AT_AR_2.0, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/mx_64t_r_at_ar.py b/dynamixel/model/mx_64t_r_at_ar.py
new file mode 100644
index 0000000..68b8d2e
--- /dev/null
+++ b/dynamixel/model/mx_64t_r_at_ar.py
@@ -0,0 +1,52 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class MX_64T_R_AT_AR(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=310),
+        Row(name='firmware_version', address=2, size=1, default=None),
+        Row(name='id', address=3, size=1, default=1),
+        Row(name='baud_rate', address=4, size=1, default=34),
+        Row(name='return_delay_time', address=5, size=1, default=250),
+        Row(name='cw_angle_limit', address=6, size=2, default=0),
+        Row(name='ccw_angle_limit', address=8, size=2, default=4095),
+        Row(name='temperature_limit', address=11, size=1, default=80),
+        Row(name='min_voltage_limit', address=12, size=1, default=60),
+        Row(name='max_voltage_limit', address=13, size=1, default=240),
+        Row(name='max_torque', address=14, size=2, default=1023),
+        Row(name='status_return_level', address=16, size=1, default=2),
+        Row(name='alarm_led', address=17, size=1, default=36),
+        Row(name='shutdown', address=18, size=1, default=36),
+        Row(name='multi_turn_offset', address=20, size=2, default=0),
+        Row(name='resolution_divider', address=22, size=1, default=1)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=24, size=1, default=0),
+        Row(name='led', address=25, size=1, default=0),
+        Row(name='d_gain', address=26, size=1, default=0),
+        Row(name='i_gain', address=27, size=1, default=0),
+        Row(name='p_gain', address=28, size=1, default=32),
+        Row(name='goal_position', address=30, size=2, default=None),
+        Row(name='moving_speed', address=32, size=2, default=None),
+        Row(name='torque_limit', address=34, size=2, default=None),
+        Row(name='present_position', address=36, size=2, default=None),
+        Row(name='present_speed', address=38, size=2, default=None),
+        Row(name='present_load', address=40, size=2, default=None),
+        Row(name='present_voltage', address=42, size=1, default=None),
+        Row(name='present_temperature', address=43, size=1, default=None),
+        Row(name='registered', address=44, size=1, default=0),
+        Row(name='moving', address=46, size=1, default=0),
+        Row(name='lock', address=47, size=1, default=0),
+        Row(name='punch', address=48, size=2, default=0),
+        Row(name='realtime_tick', address=50, size=2, default=0),
+        Row(name='current', address=68, size=2, default=0),
+        Row(name='torque_ctrl_mode_enable', address=70, size=1, default=0),
+        Row(name='goal_torque', address=71, size=2, default=0),
+        Row(name='goal_acceleration', address=73, size=1, default=0)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol1
+
+    def __init__(self, id):
+        super(MX_64T_R_AT_AR, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/mx_64t_r_at_ar_2.0.py b/dynamixel/model/mx_64t_r_at_ar_2.0.py
new file mode 100644
index 0000000..6115df3
--- /dev/null
+++ b/dynamixel/model/mx_64t_r_at_ar_2.0.py
@@ -0,0 +1,68 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class MX_64T_R_AT_AR_2.0(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=311),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='secondary_id', address=12, size=1, default=255),
+        Row(name='protocol_type', address=13, size=1, default=2),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=10),
+        Row(name='temperature_limit', address=31, size=1, default=80),
+        Row(name='max_voltage_limit', address=32, size=2, default=160),
+        Row(name='min_voltage_limit', address=34, size=2, default=95),
+        Row(name='pwm_limit', address=36, size=2, default=885),
+        Row(name='current_limit', address=38, size=2, default=1941),
+        Row(name='acceleration_limit', address=40, size=4, default=32767),
+        Row(name='velocity_limit', address=44, size=4, default=285),
+        Row(name='max_position_limit', address=48, size=4, default=4095),
+        Row(name='min_position_limit', address=52, size=4, default=0),
+        Row(name='shutdown', address=63, size=1, default=52)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=64, size=1, default=0),
+        Row(name='led', address=65, size=1, default=0),
+        Row(name='status_return_level', address=68, size=1, default=2),
+        Row(name='registered_instruction', address=69, size=1, default=0),
+        Row(name='hardware_error_status', address=70, size=1, default=0),
+        Row(name='velocity_i_gain', address=76, size=2, default=1920),
+        Row(name='velocity_p_gain', address=78, size=2, default=100),
+        Row(name='position_d_gain', address=80, size=2, default=0),
+        Row(name='position_i_gain', address=82, size=2, default=0),
+        Row(name='position_p_gain', address=84, size=2, default=850),
+        Row(name='feedforward_2nd_gain', address=88, size=2, default=0),
+        Row(name='feedforward_1st_gain', address=90, size=2, default=0),
+        Row(name='bus_watchdog', address=98, size=1, default=0),
+        Row(name='goal_pwm', address=100, size=2, default=None),
+        Row(name='goal_current', address=102, size=2, default=None),
+        Row(name='goal_velocity', address=104, size=4, default=None),
+        Row(name='profile_acceleration', address=108, size=4, default=0),
+        Row(name='profile_velocity', address=112, size=4, default=0),
+        Row(name='goal_position', address=116, size=4, default=None),
+        Row(name='realtime_tick', address=120, size=2, default=None),
+        Row(name='moving', address=122, size=1, default=0),
+        Row(name='moving_status', address=123, size=1, default=0),
+        Row(name='present_pwm', address=124, size=2, default=None),
+        Row(name='present_current', address=126, size=2, default=None),
+        Row(name='present_velocity', address=128, size=4, default=None),
+        Row(name='present_position', address=132, size=4, default=None),
+        Row(name='velocity_trajectory', address=136, size=4, default=None),
+        Row(name='position_trajectory', address=140, size=4, default=None),
+        Row(name='present_input_voltage', address=144, size=2, default=None),
+        Row(name='present_temperature', address=146, size=1, default=None),
+        IndirectRow(name='indirect_address', addresses=[range(168, 224, 2), range(578, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(224, 252), range(634, 662)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(MX_64T_R_AT_AR_2.0, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/ph42_020_s300_r.py b/dynamixel/model/ph42_020_s300_r.py
new file mode 100644
index 0000000..32b2269
--- /dev/null
+++ b/dynamixel/model/ph42_020_s300_r.py
@@ -0,0 +1,72 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class PH42_020_S300_R(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=2000),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='sencondary_id', address=12, size=1, default=255),
+        Row(name='protocol_type', address=13, size=1, default=2),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=20),
+        Row(name='temperature_limit', address=31, size=1, default=80),
+        Row(name='max_voltage_limit', address=32, size=2, default=350),
+        Row(name='min_voltage_limit', address=34, size=2, default=150),
+        Row(name='pwm_limit', address=36, size=2, default=2009),
+        Row(name='current_limit', address=38, size=2, default=4500),
+        Row(name='acceleration_limit', address=40, size=4, default=10765),
+        Row(name='velocity_limit', address=44, size=4, default=2920),
+        Row(name='max_position_limit', address=48, size=4, default=303454),
+        Row(name='min_position_limit', address=52, size=4, default=None),
+        IndirectRow(name='external_port_mode', addresses=[range(56, 60)], size=1),
+        Row(name='shutdown', address=63, size=1, default=58),
+        IndirectRow(name='indirect_address', addresses=[range(168, 424, 2)], size=2)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=512, size=1, default=0),
+        Row(name='led_red', address=513, size=1, default=0),
+        Row(name='led_green', address=514, size=1, default=0),
+        Row(name='led_blue', address=515, size=1, default=0),
+        Row(name='status_return_level', address=516, size=1, default=2),
+        Row(name='registered_instruction', address=517, size=1, default=0),
+        Row(name='hardware_error_status', address=518, size=1, default=0),
+        Row(name='velocity_i_gain', address=524, size=2, default=None),
+        Row(name='velocity_p_gain', address=526, size=2, default=None),
+        Row(name='position_d_gain', address=528, size=2, default=None),
+        Row(name='position_i_gain', address=530, size=2, default=None),
+        Row(name='position_p_gain', address=532, size=2, default=None),
+        Row(name='feedforward_2nd_gain', address=536, size=2, default=None),
+        Row(name='feedforward_1st_gain', address=538, size=2, default=None),
+        Row(name='bus_watchdog', address=546, size=1, default=None),
+        Row(name='goal_pwm', address=548, size=2, default=None),
+        Row(name='goal_current', address=550, size=2, default=None),
+        Row(name='goal_velocity', address=552, size=4, default=None),
+        Row(name='profile_acceleration', address=556, size=4, default=None),
+        Row(name='profile_velocity', address=560, size=4, default=None),
+        Row(name='goal_position', address=564, size=4, default=None),
+        Row(name='realtime_tick', address=568, size=2, default=None),
+        Row(name='moving', address=570, size=1, default=None),
+        Row(name='moving_status', address=571, size=1, default=None),
+        Row(name='present_pwm', address=572, size=2, default=None),
+        Row(name='present_current', address=574, size=2, default=None),
+        Row(name='present_velocity', address=576, size=4, default=None),
+        Row(name='present_position', address=580, size=4, default=None),
+        Row(name='velocity_trajectory', address=584, size=4, default=None),
+        Row(name='position_trajectory', address=588, size=4, default=None),
+        Row(name='present_input_voltage', address=592, size=2, default=None),
+        Row(name='present_temperature', address=594, size=1, default=None),
+        IndirectRow(name='external_port_data', addresses=[range(600, 608, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(634, 762)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(PH42_020_S300_R, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/ph54_100_s500_r.py b/dynamixel/model/ph54_100_s500_r.py
new file mode 100644
index 0000000..9e80eec
--- /dev/null
+++ b/dynamixel/model/ph54_100_s500_r.py
@@ -0,0 +1,72 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class PH54_100_S500_R(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=2010),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='sencondary_id', address=12, size=1, default=255),
+        Row(name='protocol_type', address=13, size=1, default=2),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=20),
+        Row(name='temperature_limit', address=31, size=1, default=80),
+        Row(name='max_voltage_limit', address=32, size=2, default=350),
+        Row(name='min_voltage_limit', address=34, size=2, default=150),
+        Row(name='pwm_limit', address=36, size=2, default=2009),
+        Row(name='current_limit', address=38, size=2, default=15900),
+        Row(name='acceleration_limit', address=40, size=4, default=10639),
+        Row(name='velocity_limit', address=44, size=4, default=2920),
+        Row(name='max_position_limit', address=48, size=4, default=501433),
+        Row(name='min_position_limit', address=52, size=4, default=None),
+        IndirectRow(name='external_port_mode', addresses=[range(56, 60)], size=1),
+        Row(name='shutdown', address=63, size=1, default=58),
+        IndirectRow(name='indirect_address', addresses=[range(168, 424, 2)], size=2)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=512, size=1, default=0),
+        Row(name='led_red', address=513, size=1, default=0),
+        Row(name='led_green', address=514, size=1, default=0),
+        Row(name='led_blue', address=515, size=1, default=0),
+        Row(name='status_return_level', address=516, size=1, default=2),
+        Row(name='registered_instruction', address=517, size=1, default=0),
+        Row(name='hardware_error_status', address=518, size=1, default=0),
+        Row(name='velocity_i_gain', address=524, size=2, default=None),
+        Row(name='velocity_p_gain', address=526, size=2, default=None),
+        Row(name='position_d_gain', address=528, size=2, default=None),
+        Row(name='position_i_gain', address=530, size=2, default=None),
+        Row(name='position_p_gain', address=532, size=2, default=None),
+        Row(name='feedforward_2nd_gain', address=536, size=2, default=None),
+        Row(name='feedforward_1st_gain', address=538, size=2, default=None),
+        Row(name='bus_watchdog', address=546, size=1, default=None),
+        Row(name='goal_pwm', address=548, size=2, default=None),
+        Row(name='goal_current', address=550, size=2, default=None),
+        Row(name='goal_velocity', address=552, size=4, default=None),
+        Row(name='profile_acceleration', address=556, size=4, default=None),
+        Row(name='profile_velocity', address=560, size=4, default=None),
+        Row(name='goal_position', address=564, size=4, default=None),
+        Row(name='realtime_tick', address=568, size=2, default=None),
+        Row(name='moving', address=570, size=1, default=None),
+        Row(name='moving_status', address=571, size=1, default=None),
+        Row(name='present_pwm', address=572, size=2, default=None),
+        Row(name='present_current', address=574, size=2, default=None),
+        Row(name='present_velocity', address=576, size=4, default=None),
+        Row(name='present_position', address=580, size=4, default=None),
+        Row(name='velocity_trajectory', address=584, size=4, default=None),
+        Row(name='position_trajectory', address=588, size=4, default=None),
+        Row(name='present_input_voltage', address=592, size=2, default=None),
+        Row(name='present_temperature', address=594, size=1, default=None),
+        IndirectRow(name='external_port_data', addresses=[range(600, 608, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(634, 762)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(PH54_100_S500_R, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/ph54_200_s500_r.py b/dynamixel/model/ph54_200_s500_r.py
new file mode 100644
index 0000000..d1fe857
--- /dev/null
+++ b/dynamixel/model/ph54_200_s500_r.py
@@ -0,0 +1,72 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class PH54_200_S500_R(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=2020),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='sencondary_id', address=12, size=1, default=255),
+        Row(name='protocol_type', address=13, size=1, default=2),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=20),
+        Row(name='temperature_limit', address=31, size=1, default=80),
+        Row(name='max_voltage_limit', address=32, size=2, default=350),
+        Row(name='min_voltage_limit', address=34, size=2, default=150),
+        Row(name='pwm_limit', address=36, size=2, default=2009),
+        Row(name='current_limit', address=38, size=2, default=22740),
+        Row(name='acceleration_limit', address=40, size=4, default=9982),
+        Row(name='velocity_limit', address=44, size=4, default=2900),
+        Row(name='max_position_limit', address=48, size=4, default=501433),
+        Row(name='min_position_limit', address=52, size=4, default=None),
+        IndirectRow(name='external_port_mode', addresses=[range(56, 60)], size=1),
+        Row(name='shutdown', address=63, size=1, default=52),
+        IndirectRow(name='indirect_address', addresses=[range(168, 424, 2)], size=2)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=512, size=1, default=0),
+        Row(name='led_red', address=513, size=1, default=0),
+        Row(name='led_green', address=514, size=1, default=0),
+        Row(name='led_blue', address=515, size=1, default=0),
+        Row(name='status_return_level', address=516, size=1, default=2),
+        Row(name='registered_instruction', address=517, size=1, default=0),
+        Row(name='hardware_error_status', address=518, size=1, default=0),
+        Row(name='velocity_i_gain', address=524, size=2, default=None),
+        Row(name='velocity_p_gain', address=526, size=2, default=None),
+        Row(name='position_d_gain', address=528, size=2, default=None),
+        Row(name='position_i_gain', address=530, size=2, default=None),
+        Row(name='position_p_gain', address=532, size=2, default=None),
+        Row(name='feedforward_2nd_gain', address=536, size=2, default=None),
+        Row(name='feedforward_1st_gain', address=538, size=2, default=None),
+        Row(name='bus_watchdog', address=546, size=1, default=None),
+        Row(name='goal_pwm', address=548, size=2, default=None),
+        Row(name='goal_current', address=550, size=2, default=None),
+        Row(name='goal_velocity', address=552, size=4, default=None),
+        Row(name='profile_acceleration', address=556, size=4, default=None),
+        Row(name='profile_velocity', address=560, size=4, default=None),
+        Row(name='goal_position', address=564, size=4, default=None),
+        Row(name='realtime_tick', address=568, size=2, default=None),
+        Row(name='moving', address=570, size=1, default=None),
+        Row(name='moving_status', address=571, size=1, default=None),
+        Row(name='present_pwm', address=572, size=2, default=None),
+        Row(name='present_current', address=574, size=2, default=None),
+        Row(name='present_velocity', address=576, size=4, default=None),
+        Row(name='present_position', address=580, size=4, default=None),
+        Row(name='velocity_trajectory', address=584, size=4, default=None),
+        Row(name='position_trajectory', address=588, size=4, default=None),
+        Row(name='present_input_voltage', address=592, size=2, default=None),
+        Row(name='present_temperature', address=594, size=1, default=None),
+        IndirectRow(name='external_port_data', addresses=[range(600, 608, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(634, 762)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(PH54_200_S500_R, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/pm42_010_s260_r.py b/dynamixel/model/pm42_010_s260_r.py
new file mode 100644
index 0000000..e2bc049
--- /dev/null
+++ b/dynamixel/model/pm42_010_s260_r.py
@@ -0,0 +1,72 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class PM42_010_S260_R(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=2100),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='sencondary_id', address=12, size=1, default=255),
+        Row(name='protocol_type', address=13, size=1, default=2),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=20),
+        Row(name='temperature_limit', address=31, size=1, default=80),
+        Row(name='max_voltage_limit', address=32, size=2, default=350),
+        Row(name='min_voltage_limit', address=34, size=2, default=150),
+        Row(name='pwm_limit', address=36, size=2, default=2009),
+        Row(name='current_limit', address=38, size=2, default=1461),
+        Row(name='acceleration_limit', address=40, size=4, default=10867),
+        Row(name='velocity_limit', address=44, size=4, default=2600),
+        Row(name='max_position_limit', address=48, size=4, default=262931),
+        Row(name='min_position_limit', address=52, size=4, default=None),
+        IndirectRow(name='external_port_mode', addresses=[range(56, 60)], size=1),
+        Row(name='shutdown', address=63, size=1, default=58),
+        IndirectRow(name='indirect_address', addresses=[range(168, 424, 2)], size=2)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=512, size=1, default=0),
+        Row(name='led_red', address=513, size=1, default=0),
+        Row(name='led_green', address=514, size=1, default=0),
+        Row(name='led_blue', address=515, size=1, default=0),
+        Row(name='status_return_level', address=516, size=1, default=2),
+        Row(name='registered_instruction', address=517, size=1, default=0),
+        Row(name='hardware_error_status', address=518, size=1, default=0),
+        Row(name='velocity_i_gain', address=524, size=2, default=None),
+        Row(name='velocity_p_gain', address=526, size=2, default=None),
+        Row(name='position_d_gain', address=528, size=2, default=None),
+        Row(name='position_i_gain', address=530, size=2, default=None),
+        Row(name='position_p_gain', address=532, size=2, default=None),
+        Row(name='feedforward_2nd_gain', address=536, size=2, default=None),
+        Row(name='feedforward_1st_gain', address=538, size=2, default=None),
+        Row(name='bus_watchdog', address=546, size=1, default=None),
+        Row(name='goal_pwm', address=548, size=2, default=None),
+        Row(name='goal_current', address=550, size=2, default=None),
+        Row(name='goal_velocity', address=552, size=4, default=None),
+        Row(name='profile_acceleration', address=556, size=4, default=None),
+        Row(name='profile_velocity', address=560, size=4, default=None),
+        Row(name='goal_position', address=564, size=4, default=None),
+        Row(name='realtime_tick', address=568, size=2, default=None),
+        Row(name='moving', address=570, size=1, default=None),
+        Row(name='moving_status', address=571, size=1, default=None),
+        Row(name='present_pwm', address=572, size=2, default=None),
+        Row(name='present_current', address=574, size=2, default=None),
+        Row(name='present_velocity', address=576, size=4, default=None),
+        Row(name='present_position', address=580, size=4, default=None),
+        Row(name='velocity_trajectory', address=584, size=4, default=None),
+        Row(name='position_trajectory', address=588, size=4, default=None),
+        Row(name='present_input_voltage', address=592, size=2, default=None),
+        Row(name='present_temperature', address=594, size=1, default=None),
+        IndirectRow(name='external_port_data', addresses=[range(600, 608, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(634, 762)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(PM42_010_S260_R, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/pm54_040_s250_r.py b/dynamixel/model/pm54_040_s250_r.py
new file mode 100644
index 0000000..8289ef9
--- /dev/null
+++ b/dynamixel/model/pm54_040_s250_r.py
@@ -0,0 +1,72 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class PM54_040_S250_R(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=2110),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='sencondary_id', address=12, size=1, default=255),
+        Row(name='protocol_type', address=13, size=1, default=2),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=20),
+        Row(name='temperature_limit', address=31, size=1, default=80),
+        Row(name='max_voltage_limit', address=32, size=2, default=350),
+        Row(name='min_voltage_limit', address=34, size=2, default=150),
+        Row(name='pwm_limit', address=36, size=2, default=2009),
+        Row(name='current_limit', address=38, size=2, default=4470),
+        Row(name='acceleration_limit', address=40, size=4, default=11037),
+        Row(name='velocity_limit', address=44, size=4, default=2840),
+        Row(name='max_position_limit', address=48, size=4, default=251173),
+        Row(name='min_position_limit', address=52, size=4, default=None),
+        IndirectRow(name='external_port_mode', addresses=[range(56, 60)], size=1),
+        Row(name='shutdown', address=63, size=1, default=58),
+        IndirectRow(name='indirect_address', addresses=[range(168, 424, 2)], size=2)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=512, size=1, default=0),
+        Row(name='led_red', address=513, size=1, default=0),
+        Row(name='led_green', address=514, size=1, default=0),
+        Row(name='led_blue', address=515, size=1, default=0),
+        Row(name='status_return_level', address=516, size=1, default=2),
+        Row(name='registered_instruction', address=517, size=1, default=0),
+        Row(name='hardware_error_status', address=518, size=1, default=0),
+        Row(name='velocity_i_gain', address=524, size=2, default=None),
+        Row(name='velocity_p_gain', address=526, size=2, default=None),
+        Row(name='position_d_gain', address=528, size=2, default=None),
+        Row(name='position_i_gain', address=530, size=2, default=None),
+        Row(name='position_p_gain', address=532, size=2, default=None),
+        Row(name='feedforward_2nd_gain', address=536, size=2, default=None),
+        Row(name='feedforward_1st_gain', address=538, size=2, default=None),
+        Row(name='bus_watchdog', address=546, size=1, default=None),
+        Row(name='goal_pwm', address=548, size=2, default=None),
+        Row(name='goal_current', address=550, size=2, default=None),
+        Row(name='goal_velocity', address=552, size=4, default=None),
+        Row(name='profile_acceleration', address=556, size=4, default=None),
+        Row(name='profile_velocity', address=560, size=4, default=None),
+        Row(name='goal_position', address=564, size=4, default=None),
+        Row(name='realtime_tick', address=568, size=2, default=None),
+        Row(name='moving', address=570, size=1, default=None),
+        Row(name='moving_status', address=571, size=1, default=None),
+        Row(name='present_pwm', address=572, size=2, default=None),
+        Row(name='present_current', address=574, size=2, default=None),
+        Row(name='present_velocity', address=576, size=4, default=None),
+        Row(name='present_position', address=580, size=4, default=None),
+        Row(name='velocity_trajectory', address=584, size=4, default=None),
+        Row(name='position_trajectory', address=588, size=4, default=None),
+        Row(name='present_input_voltage', address=592, size=2, default=None),
+        Row(name='present_temperature', address=594, size=1, default=None),
+        IndirectRow(name='external_port_data', addresses=[range(600, 608, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(634, 762)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(PM54_040_S250_R, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/pm54_060_s250_r.py b/dynamixel/model/pm54_060_s250_r.py
new file mode 100644
index 0000000..ef29728
--- /dev/null
+++ b/dynamixel/model/pm54_060_s250_r.py
@@ -0,0 +1,72 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class PM54_060_S250_R(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=2120),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='secondary_id', address=12, size=1, default=255),
+        Row(name='protocol_type', address=13, size=1, default=2),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=20),
+        Row(name='temperature_limit', address=31, size=1, default=80),
+        Row(name='max_voltage_limit', address=32, size=2, default=350),
+        Row(name='min_voltage_limit', address=34, size=2, default=150),
+        Row(name='pwm_limit', address=36, size=2, default=2009),
+        Row(name='current_limit', address=38, size=2, default=7980),
+        Row(name='acceleration_limit', address=40, size=4, default=11145),
+        Row(name='velocity_limit', address=44, size=4, default=2830),
+        Row(name='max_position_limit', address=48, size=4, default=251173),
+        Row(name='min_position_limit', address=52, size=4, default=None),
+        IndirectRow(name='external_port_mode', addresses=[range(56, 60)], size=1),
+        Row(name='shutdown', address=63, size=1, default=58),
+        IndirectRow(name='indirect_address', addresses=[range(168, 424, 2)], size=2)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=512, size=1, default=0),
+        Row(name='led_red', address=513, size=1, default=0),
+        Row(name='led_green', address=514, size=1, default=0),
+        Row(name='led_blue', address=515, size=1, default=0),
+        Row(name='status_return_level', address=516, size=1, default=2),
+        Row(name='registered_instruction', address=517, size=1, default=0),
+        Row(name='hardware_error_status', address=518, size=1, default=0),
+        Row(name='velocity_i_gain', address=524, size=2, default=None),
+        Row(name='velocity_p_gain', address=526, size=2, default=None),
+        Row(name='position_d_gain', address=528, size=2, default=None),
+        Row(name='position_i_gain', address=530, size=2, default=None),
+        Row(name='position_p_gain', address=532, size=2, default=None),
+        Row(name='feedforward_2nd_gain', address=536, size=2, default=None),
+        Row(name='feedforward_1st_gain', address=538, size=2, default=None),
+        Row(name='bus_watchdog', address=546, size=1, default=None),
+        Row(name='goal_pwm', address=548, size=2, default=None),
+        Row(name='goal_current', address=550, size=2, default=None),
+        Row(name='goal_velocity', address=552, size=4, default=None),
+        Row(name='profile_acceleration', address=556, size=4, default=None),
+        Row(name='profile_velocity', address=560, size=4, default=None),
+        Row(name='goal_position', address=564, size=4, default=None),
+        Row(name='realtime_tick', address=568, size=2, default=None),
+        Row(name='moving', address=570, size=1, default=None),
+        Row(name='moving_status', address=571, size=1, default=None),
+        Row(name='present_pwm', address=572, size=2, default=None),
+        Row(name='present_current', address=574, size=2, default=None),
+        Row(name='present_velocity', address=576, size=4, default=None),
+        Row(name='present_position', address=580, size=4, default=None),
+        Row(name='velocity_trajectory', address=584, size=4, default=None),
+        Row(name='position_trajectory', address=588, size=4, default=None),
+        Row(name='present_input_voltage', address=592, size=2, default=None),
+        Row(name='present_temperature', address=594, size=1, default=None),
+        IndirectRow(name='external_port_data', addresses=[range(600, 608, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(634, 762)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(PM54_060_S250_R, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/rx_10.py b/dynamixel/model/rx_10.py
new file mode 100644
index 0000000..2d3372b
--- /dev/null
+++ b/dynamixel/model/rx_10.py
@@ -0,0 +1,46 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class RX_10(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=10),
+        Row(name='firmware_version', address=2, size=1, default=None),
+        Row(name='id', address=3, size=1, default=1),
+        Row(name='baud_rate', address=4, size=1, default=34),
+        Row(name='return_delay_time', address=5, size=1, default=250),
+        Row(name='cw_angle_limit', address=6, size=2, default=0),
+        Row(name='ccw_angle_limit', address=8, size=2, default=1023),
+        Row(name='temperature_limit', address=11, size=1, default=80),
+        Row(name='min_voltage_limit', address=12, size=1, default=60),
+        Row(name='max_voltage_limit', address=13, size=1, default=190),
+        Row(name='max_torque', address=14, size=2, default=1023),
+        Row(name='status_return_level', address=16, size=1, default=2),
+        Row(name='alarm_led', address=17, size=1, default=36),
+        Row(name='shutdown', address=18, size=1, default=36)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=24, size=1, default=0),
+        Row(name='led', address=25, size=1, default=0),
+        Row(name='cw_compliance_margin', address=26, size=1, default=1),
+        Row(name='ccw_compliance_margin', address=27, size=1, default=1),
+        Row(name='cw_compliance_slope', address=28, size=1, default=32),
+        Row(name='ccw_compliance_slope', address=29, size=1, default=32),
+        Row(name='goal_position', address=30, size=2, default=None),
+        Row(name='moving_speed', address=32, size=2, default=None),
+        Row(name='torque_limit', address=34, size=2, default=None),
+        Row(name='present_position', address=36, size=2, default=None),
+        Row(name='present_speed', address=38, size=2, default=None),
+        Row(name='present_load', address=40, size=2, default=None),
+        Row(name='present_voltage', address=42, size=1, default=None),
+        Row(name='present_temperature', address=43, size=1, default=None),
+        Row(name='registered', address=44, size=1, default=0),
+        Row(name='moving', address=46, size=1, default=0),
+        Row(name='lock', address=47, size=1, default=0),
+        Row(name='punch', address=48, size=2, default=32)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol1
+
+    def __init__(self, id):
+        super(RX_10, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/rx_24f.py b/dynamixel/model/rx_24f.py
new file mode 100644
index 0000000..40b2602
--- /dev/null
+++ b/dynamixel/model/rx_24f.py
@@ -0,0 +1,46 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class RX_24F(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=24),
+        Row(name='firmware_version', address=2, size=1, default=None),
+        Row(name='id', address=3, size=1, default=1),
+        Row(name='baud_rate', address=4, size=1, default=34),
+        Row(name='return_delay_time', address=5, size=1, default=250),
+        Row(name='cw_angle_limit', address=6, size=2, default=0),
+        Row(name='ccw_angle_limit', address=8, size=2, default=1023),
+        Row(name='temperature_limit', address=11, size=1, default=80),
+        Row(name='min_voltage_limit', address=12, size=1, default=60),
+        Row(name='max_voltage_limit', address=13, size=1, default=190),
+        Row(name='max_torque', address=14, size=2, default=1023),
+        Row(name='status_return_level', address=16, size=1, default=2),
+        Row(name='alarm_led', address=17, size=1, default=36),
+        Row(name='shutdown', address=18, size=1, default=36)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=24, size=1, default=0),
+        Row(name='led', address=25, size=1, default=0),
+        Row(name='cw_compliance_margin', address=26, size=1, default=1),
+        Row(name='ccw_compliance_margin', address=27, size=1, default=1),
+        Row(name='cw_compliance_slope', address=28, size=1, default=32),
+        Row(name='ccw_compliance_slope', address=29, size=1, default=32),
+        Row(name='goal_position', address=30, size=2, default=None),
+        Row(name='moving_speed', address=32, size=2, default=None),
+        Row(name='torque_limit', address=34, size=2, default=None),
+        Row(name='present_position', address=36, size=2, default=None),
+        Row(name='present_speed', address=38, size=2, default=None),
+        Row(name='present_load', address=40, size=2, default=None),
+        Row(name='present_voltage', address=42, size=1, default=None),
+        Row(name='present_temperature', address=43, size=1, default=None),
+        Row(name='registered', address=44, size=1, default=0),
+        Row(name='moving', address=46, size=1, default=0),
+        Row(name='lock', address=47, size=1, default=0),
+        Row(name='punch', address=48, size=2, default=32)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol1
+
+    def __init__(self, id):
+        super(RX_24F, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/rx_28.py b/dynamixel/model/rx_28.py
new file mode 100644
index 0000000..71fbb7d
--- /dev/null
+++ b/dynamixel/model/rx_28.py
@@ -0,0 +1,46 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class RX_28(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=28),
+        Row(name='firmware_version', address=2, size=1, default=None),
+        Row(name='id', address=3, size=1, default=1),
+        Row(name='baud_rate', address=4, size=1, default=34),
+        Row(name='return_delay_time', address=5, size=1, default=250),
+        Row(name='cw_angle_limit', address=6, size=2, default=0),
+        Row(name='ccw_angle_limit', address=8, size=2, default=1023),
+        Row(name='temperature_limit', address=11, size=1, default=80),
+        Row(name='min_voltage_limit', address=12, size=1, default=60),
+        Row(name='max_voltage_limit', address=13, size=1, default=190),
+        Row(name='max_torque', address=14, size=2, default=1023),
+        Row(name='status_return_level', address=16, size=1, default=2),
+        Row(name='alarm_led', address=17, size=1, default=36),
+        Row(name='shutdown', address=18, size=1, default=36)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=24, size=1, default=0),
+        Row(name='led', address=25, size=1, default=0),
+        Row(name='cw_compliance_margin', address=26, size=1, default=1),
+        Row(name='ccw_compliance_margin', address=27, size=1, default=1),
+        Row(name='cw_compliance_slope', address=28, size=1, default=32),
+        Row(name='ccw_compliance_slope', address=29, size=1, default=32),
+        Row(name='goal_position', address=30, size=2, default=None),
+        Row(name='moving_speed', address=32, size=2, default=None),
+        Row(name='torque_limit', address=34, size=2, default=None),
+        Row(name='present_position', address=36, size=2, default=None),
+        Row(name='present_speed', address=38, size=2, default=None),
+        Row(name='present_load', address=40, size=2, default=None),
+        Row(name='present_voltage', address=42, size=1, default=None),
+        Row(name='present_temperature', address=43, size=1, default=None),
+        Row(name='registered', address=44, size=1, default=0),
+        Row(name='moving', address=46, size=1, default=0),
+        Row(name='lock', address=47, size=1, default=0),
+        Row(name='punch', address=48, size=2, default=32)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol1
+
+    def __init__(self, id):
+        super(RX_28, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/rx_64.py b/dynamixel/model/rx_64.py
new file mode 100644
index 0000000..88dbce4
--- /dev/null
+++ b/dynamixel/model/rx_64.py
@@ -0,0 +1,46 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class RX_64(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=64),
+        Row(name='firmware_version', address=2, size=1, default=None),
+        Row(name='id', address=3, size=1, default=1),
+        Row(name='baud_rate', address=4, size=1, default=34),
+        Row(name='return_delay_time', address=5, size=1, default=250),
+        Row(name='cw_angle_limit', address=6, size=2, default=0),
+        Row(name='ccw_angle_limit', address=8, size=2, default=1023),
+        Row(name='temperature_limit', address=11, size=1, default=80),
+        Row(name='min_voltage_limit', address=12, size=1, default=60),
+        Row(name='max_voltage_limit', address=13, size=1, default=190),
+        Row(name='max_torque', address=14, size=2, default=1023),
+        Row(name='status_return_level', address=16, size=1, default=2),
+        Row(name='alarm_led', address=17, size=1, default=36),
+        Row(name='shutdown', address=18, size=1, default=36)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=24, size=1, default=0),
+        Row(name='led', address=25, size=1, default=0),
+        Row(name='cw_compliance_margin', address=26, size=1, default=1),
+        Row(name='ccw_compliance_margin', address=27, size=1, default=1),
+        Row(name='cw_compliance_slope', address=28, size=1, default=32),
+        Row(name='ccw_compliance_slope', address=29, size=1, default=32),
+        Row(name='goal_position', address=30, size=2, default=None),
+        Row(name='moving_speed', address=32, size=2, default=None),
+        Row(name='torque_limit', address=34, size=2, default=None),
+        Row(name='present_position', address=36, size=2, default=None),
+        Row(name='present_speed', address=38, size=2, default=None),
+        Row(name='present_load', address=40, size=2, default=None),
+        Row(name='present_voltage', address=42, size=1, default=None),
+        Row(name='present_temperature', address=43, size=1, default=None),
+        Row(name='registered', address=44, size=1, default=0),
+        Row(name='moving', address=46, size=1, default=0),
+        Row(name='lock', address=47, size=1, default=0),
+        Row(name='punch', address=48, size=2, default=32)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol1
+
+    def __init__(self, id):
+        super(RX_64, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/xc430_w150_t.py b/dynamixel/model/xc430_w150_t.py
new file mode 100644
index 0000000..4c997a3
--- /dev/null
+++ b/dynamixel/model/xc430_w150_t.py
@@ -0,0 +1,65 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class XC430_W150_T(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=1070),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='secondary_id', address=12, size=1, default=255),
+        Row(name='protocol_type', address=13, size=1, default=2),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=20),
+        Row(name='temperature_limit', address=31, size=1, default=80),
+        Row(name='max_voltage_limit', address=32, size=2, default=160),
+        Row(name='min_voltage_limit', address=34, size=2, default=60),
+        Row(name='pwm_limit', address=36, size=2, default=885),
+        Row(name='velocity_limit', address=44, size=4, default=460),
+        Row(name='max_position_limit', address=48, size=4, default=4095),
+        Row(name='min_position_limit', address=52, size=4, default=0),
+        Row(name='shutdown', address=63, size=1, default=52)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=64, size=1, default=0),
+        Row(name='led', address=65, size=1, default=0),
+        Row(name='status_return_level', address=68, size=1, default=2),
+        Row(name='registered_instruction', address=69, size=1, default=0),
+        Row(name='hardware_error_status', address=70, size=1, default=0),
+        Row(name='velocity_i_gain', address=76, size=2, default=1920),
+        Row(name='velocity_p_gain', address=78, size=2, default=100),
+        Row(name='position_d_gain', address=80, size=2, default=0),
+        Row(name='position_i_gain', address=82, size=2, default=0),
+        Row(name='position_p_gain', address=84, size=2, default=460),
+        Row(name='feedforward_2nd_gain', address=88, size=2, default=0),
+        Row(name='feedforward_1st_gain', address=90, size=2, default=0),
+        Row(name='bus_watchdog', address=98, size=1, default=0),
+        Row(name='goal_pwm', address=100, size=2, default=None),
+        Row(name='goal_velocity', address=104, size=4, default=None),
+        Row(name='profile_acceleration', address=108, size=4, default=0),
+        Row(name='profile_velocity', address=112, size=4, default=0),
+        Row(name='goal_position', address=116, size=4, default=None),
+        Row(name='realtime_tick', address=120, size=2, default=None),
+        Row(name='moving', address=122, size=1, default=0),
+        Row(name='moving_status', address=123, size=1, default=0),
+        Row(name='present_pwm', address=124, size=2, default=None),
+        Row(name='present_load', address=126, size=2, default=None),
+        Row(name='present_velocity', address=128, size=4, default=None),
+        Row(name='present_position', address=132, size=4, default=None),
+        Row(name='velocity_trajectory', address=136, size=4, default=None),
+        Row(name='position_trajectory', address=140, size=4, default=None),
+        Row(name='present_input_voltage', address=144, size=2, default=None),
+        Row(name='present_temperature', address=146, size=1, default=None),
+        IndirectRow(name='indirect_address', addresses=[range(168, 224, 2), range(578, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(224, 252), range(634, 662)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(XC430_W150_T, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/xc430_w240_t.py b/dynamixel/model/xc430_w240_t.py
new file mode 100644
index 0000000..ca90954
--- /dev/null
+++ b/dynamixel/model/xc430_w240_t.py
@@ -0,0 +1,65 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class XC430_W240_T(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=1080),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='secondary_id', address=12, size=1, default=255),
+        Row(name='protocol_type', address=13, size=1, default=2),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=10),
+        Row(name='temperature_limit', address=31, size=1, default=80),
+        Row(name='max_voltage_limit', address=32, size=2, default=160),
+        Row(name='min_voltage_limit', address=34, size=2, default=60),
+        Row(name='pwm_limit', address=36, size=2, default=885),
+        Row(name='velocity_limit', address=44, size=4, default=306),
+        Row(name='max_position_limit', address=48, size=4, default=4095),
+        Row(name='min_position_limit', address=52, size=4, default=0),
+        Row(name='shutdown', address=63, size=1, default=52)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=64, size=1, default=0),
+        Row(name='led', address=65, size=1, default=0),
+        Row(name='status_return_level', address=68, size=1, default=2),
+        Row(name='registered_instruction', address=69, size=1, default=0),
+        Row(name='hardware_error_status', address=70, size=1, default=0),
+        Row(name='velocity_i_gain', address=76, size=2, default=1920),
+        Row(name='velocity_p_gain', address=78, size=2, default=100),
+        Row(name='position_d_gain', address=80, size=2, default=0),
+        Row(name='position_i_gain', address=82, size=2, default=0),
+        Row(name='position_p_gain', address=84, size=2, default=700),
+        Row(name='feedforward_2nd_gain', address=88, size=2, default=0),
+        Row(name='feedforward_1st_gain', address=90, size=2, default=0),
+        Row(name='bus_watchdog', address=98, size=1, default=0),
+        Row(name='goal_pwm', address=100, size=2, default=None),
+        Row(name='goal_velocity', address=104, size=4, default=None),
+        Row(name='profile_acceleration', address=108, size=4, default=0),
+        Row(name='profile_velocity', address=112, size=4, default=0),
+        Row(name='goal_position', address=116, size=4, default=None),
+        Row(name='realtime_tick', address=120, size=2, default=None),
+        Row(name='moving', address=122, size=1, default=0),
+        Row(name='moving_status', address=123, size=1, default=0),
+        Row(name='present_pwm', address=124, size=2, default=None),
+        Row(name='present_load', address=126, size=2, default=None),
+        Row(name='present_velocity', address=128, size=4, default=None),
+        Row(name='present_position', address=132, size=4, default=None),
+        Row(name='velocity_trajectory', address=136, size=4, default=None),
+        Row(name='position_trajectory', address=140, size=4, default=None),
+        Row(name='present_input_voltage', address=144, size=2, default=None),
+        Row(name='present_temperature', address=146, size=1, default=None),
+        IndirectRow(name='indirect_address', addresses=[range(168, 224, 2), range(578, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(224, 252), range(634, 662)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(XC430_W240_T, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/xh430_v210_r.py b/dynamixel/model/xh430_v210_r.py
new file mode 100644
index 0000000..7a4c3ef
--- /dev/null
+++ b/dynamixel/model/xh430_v210_r.py
@@ -0,0 +1,67 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class XH430_V210_R(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=1050),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='secondary_id', address=12, size=1, default=255),
+        Row(name='protocol_type', address=13, size=1, default=2),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=10),
+        Row(name='temperature_limit', address=31, size=1, default=80),
+        Row(name='max_voltage_limit', address=32, size=2, default=300),
+        Row(name='min_voltage_limit', address=34, size=2, default=110),
+        Row(name='pwm_limit', address=36, size=2, default=885),
+        Row(name='current_limit', address=38, size=2, default=689),
+        Row(name='velocity_limit', address=44, size=4, default=230),
+        Row(name='max_position_limit', address=48, size=4, default=4095),
+        Row(name='min_position_limit', address=52, size=4, default=0),
+        Row(name='shutdown', address=63, size=1, default=52)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=64, size=1, default=0),
+        Row(name='led', address=65, size=1, default=0),
+        Row(name='status_return_level', address=68, size=1, default=2),
+        Row(name='registered_instruction', address=69, size=1, default=0),
+        Row(name='hardware_error_status', address=70, size=1, default=0),
+        Row(name='velocity_i_gain', address=76, size=2, default=1920),
+        Row(name='velocity_p_gain', address=78, size=2, default=100),
+        Row(name='position_d_gain', address=80, size=2, default=0),
+        Row(name='position_i_gain', address=82, size=2, default=0),
+        Row(name='position_p_gain', address=84, size=2, default=800),
+        Row(name='feedforward_2nd_gain', address=88, size=2, default=0),
+        Row(name='feedforward_1st_gain', address=90, size=2, default=0),
+        Row(name='bus_watchdog', address=98, size=1, default=0),
+        Row(name='goal_pwm', address=100, size=2, default=None),
+        Row(name='goal_current', address=102, size=2, default=None),
+        Row(name='goal_velocity', address=104, size=4, default=None),
+        Row(name='profile_acceleration', address=108, size=4, default=0),
+        Row(name='profile_velocity', address=112, size=4, default=0),
+        Row(name='goal_position', address=116, size=4, default=None),
+        Row(name='realtime_tick', address=120, size=2, default=None),
+        Row(name='moving', address=122, size=1, default=0),
+        Row(name='moving_status', address=123, size=1, default=0),
+        Row(name='present_pwm', address=124, size=2, default=None),
+        Row(name='present_current', address=126, size=2, default=None),
+        Row(name='present_velocity', address=128, size=4, default=None),
+        Row(name='present_position', address=132, size=4, default=None),
+        Row(name='velocity_trajectory', address=136, size=4, default=None),
+        Row(name='position_trajectory', address=140, size=4, default=None),
+        Row(name='present_input_voltage', address=144, size=2, default=None),
+        Row(name='present_temperature', address=146, size=1, default=None),
+        IndirectRow(name='indirect_address', addresses=[range(168, 224, 2), range(578, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(224, 252), range(634, 662)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(XH430_V210_R, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/xh430_v350_r.py b/dynamixel/model/xh430_v350_r.py
new file mode 100644
index 0000000..db5ae3b
--- /dev/null
+++ b/dynamixel/model/xh430_v350_r.py
@@ -0,0 +1,67 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class XH430_V350_R(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=1040),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='secondary_id', address=12, size=1, default=255),
+        Row(name='protocol_type', address=13, size=1, default=2),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=10),
+        Row(name='temperature_limit', address=31, size=1, default=80),
+        Row(name='max_voltage_limit', address=32, size=2, default=300),
+        Row(name='min_voltage_limit', address=34, size=2, default=110),
+        Row(name='pwm_limit', address=36, size=2, default=885),
+        Row(name='current_limit', address=38, size=2, default=689),
+        Row(name='velocity_limit', address=44, size=4, default=135),
+        Row(name='max_position_limit', address=48, size=4, default=4095),
+        Row(name='min_position_limit', address=52, size=4, default=0),
+        Row(name='shutdown', address=63, size=1, default=52)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=64, size=1, default=0),
+        Row(name='led', address=65, size=1, default=0),
+        Row(name='status_return_level', address=68, size=1, default=2),
+        Row(name='registered_instruction', address=69, size=1, default=0),
+        Row(name='hardware_error_status', address=70, size=1, default=0),
+        Row(name='velocity_i_gain', address=76, size=2, default=1920),
+        Row(name='velocity_p_gain', address=78, size=2, default=100),
+        Row(name='position_d_gain', address=80, size=2, default=0),
+        Row(name='position_i_gain', address=82, size=2, default=0),
+        Row(name='position_p_gain', address=84, size=2, default=800),
+        Row(name='feedforward_2nd_gain', address=88, size=2, default=0),
+        Row(name='feedforward_1st_gain', address=90, size=2, default=0),
+        Row(name='bus_watchdog', address=98, size=1, default=0),
+        Row(name='goal_pwm', address=100, size=2, default=None),
+        Row(name='goal_current', address=102, size=2, default=None),
+        Row(name='goal_velocity', address=104, size=4, default=None),
+        Row(name='profile_acceleration', address=108, size=4, default=0),
+        Row(name='profile_velocity', address=112, size=4, default=0),
+        Row(name='goal_position', address=116, size=4, default=None),
+        Row(name='realtime_tick', address=120, size=2, default=None),
+        Row(name='moving', address=122, size=1, default=0),
+        Row(name='moving_status', address=123, size=1, default=0),
+        Row(name='present_pwm', address=124, size=2, default=None),
+        Row(name='present_current', address=126, size=2, default=None),
+        Row(name='present_velocity', address=128, size=4, default=None),
+        Row(name='present_position', address=132, size=4, default=None),
+        Row(name='velocity_trajectory', address=136, size=4, default=None),
+        Row(name='position_trajectory', address=140, size=4, default=None),
+        Row(name='present_input_voltage', address=144, size=2, default=None),
+        Row(name='present_temperature', address=146, size=1, default=None),
+        IndirectRow(name='indirect_address', addresses=[range(168, 224, 2), range(578, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(224, 252), range(634, 662)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(XH430_V350_R, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/xh430_w210_t_r.py b/dynamixel/model/xh430_w210_t_r.py
new file mode 100644
index 0000000..3bd9ae2
--- /dev/null
+++ b/dynamixel/model/xh430_w210_t_r.py
@@ -0,0 +1,67 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class XH430_W210_T_R(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=1010),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='secondary_id', address=12, size=1, default=255),
+        Row(name='protocol_type', address=13, size=1, default=2),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=10),
+        Row(name='temperature_limit', address=31, size=1, default=80),
+        Row(name='max_voltage_limit', address=32, size=2, default=160),
+        Row(name='min_voltage_limit', address=34, size=2, default=95),
+        Row(name='pwm_limit', address=36, size=2, default=885),
+        Row(name='current_limit', address=38, size=2, default=648),
+        Row(name='velocity_limit', address=44, size=4, default=210),
+        Row(name='max_position_limit', address=48, size=4, default=4095),
+        Row(name='min_position_limit', address=52, size=4, default=0),
+        Row(name='shutdown', address=63, size=1, default=52)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=64, size=1, default=0),
+        Row(name='led', address=65, size=1, default=0),
+        Row(name='status_return_level', address=68, size=1, default=2),
+        Row(name='registered_instruction', address=69, size=1, default=0),
+        Row(name='hardware_error_status', address=70, size=1, default=0),
+        Row(name='velocity_i_gain', address=76, size=2, default=1920),
+        Row(name='velocity_p_gain', address=78, size=2, default=100),
+        Row(name='position_d_gain', address=80, size=2, default=0),
+        Row(name='position_i_gain', address=82, size=2, default=0),
+        Row(name='position_p_gain', address=84, size=2, default=900),
+        Row(name='feedforward_2nd_gain', address=88, size=2, default=0),
+        Row(name='feedforward_1st_gain', address=90, size=2, default=0),
+        Row(name='bus_watchdog', address=98, size=1, default=0),
+        Row(name='goal_pwm', address=100, size=2, default=None),
+        Row(name='goal_current', address=102, size=2, default=None),
+        Row(name='goal_velocity', address=104, size=4, default=None),
+        Row(name='profile_acceleration', address=108, size=4, default=0),
+        Row(name='profile_velocity', address=112, size=4, default=0),
+        Row(name='goal_position', address=116, size=4, default=None),
+        Row(name='realtime_tick', address=120, size=2, default=None),
+        Row(name='moving', address=122, size=1, default=0),
+        Row(name='moving_status', address=123, size=1, default=0),
+        Row(name='present_pwm', address=124, size=2, default=None),
+        Row(name='present_current', address=126, size=2, default=None),
+        Row(name='present_velocity', address=128, size=4, default=None),
+        Row(name='present_position', address=132, size=4, default=None),
+        Row(name='velocity_trajectory', address=136, size=4, default=None),
+        Row(name='position_trajectory', address=140, size=4, default=None),
+        Row(name='present_input_voltage', address=144, size=2, default=None),
+        Row(name='present_temperature', address=146, size=1, default=None),
+        IndirectRow(name='indirect_address', addresses=[range(168, 224, 2), range(578, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(224, 252), range(634, 662)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(XH430_W210_T_R, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/xh430_w350_t_r.py b/dynamixel/model/xh430_w350_t_r.py
new file mode 100644
index 0000000..3b28cb9
--- /dev/null
+++ b/dynamixel/model/xh430_w350_t_r.py
@@ -0,0 +1,67 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class XH430_W350_T_R(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=1000),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='secondary_id', address=12, size=1, default=255),
+        Row(name='protocol_type', address=13, size=1, default=2),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=10),
+        Row(name='temperature_limit', address=31, size=1, default=80),
+        Row(name='max_voltage_limit', address=32, size=2, default=160),
+        Row(name='min_voltage_limit', address=34, size=2, default=95),
+        Row(name='pwm_limit', address=36, size=2, default=885),
+        Row(name='current_limit', address=38, size=2, default=648),
+        Row(name='velocity_limit', address=44, size=4, default=130),
+        Row(name='max_position_limit', address=48, size=4, default=4095),
+        Row(name='min_position_limit', address=52, size=4, default=0),
+        Row(name='shutdown', address=63, size=1, default=52)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=64, size=1, default=0),
+        Row(name='led', address=65, size=1, default=0),
+        Row(name='status_return_level', address=68, size=1, default=2),
+        Row(name='registered_instruction', address=69, size=1, default=0),
+        Row(name='hardware_error_status', address=70, size=1, default=0),
+        Row(name='velocity_i_gain', address=76, size=2, default=1920),
+        Row(name='velocity_p_gain', address=78, size=2, default=100),
+        Row(name='position_d_gain', address=80, size=2, default=0),
+        Row(name='position_i_gain', address=82, size=2, default=0),
+        Row(name='position_p_gain', address=84, size=2, default=900),
+        Row(name='feedforward_2nd_gain', address=88, size=2, default=0),
+        Row(name='feedforward_1st_gain', address=90, size=2, default=0),
+        Row(name='bus_watchdog', address=98, size=1, default=0),
+        Row(name='goal_pwm', address=100, size=2, default=None),
+        Row(name='goal_current', address=102, size=2, default=None),
+        Row(name='goal_velocity', address=104, size=4, default=None),
+        Row(name='profile_acceleration', address=108, size=4, default=0),
+        Row(name='profile_velocity', address=112, size=4, default=0),
+        Row(name='goal_position', address=116, size=4, default=None),
+        Row(name='realtime_tick', address=120, size=2, default=None),
+        Row(name='moving', address=122, size=1, default=0),
+        Row(name='moving_status', address=123, size=1, default=0),
+        Row(name='present_pwm', address=124, size=2, default=None),
+        Row(name='present_current', address=126, size=2, default=None),
+        Row(name='present_velocity', address=128, size=4, default=None),
+        Row(name='present_position', address=132, size=4, default=None),
+        Row(name='velocity_trajectory', address=136, size=4, default=None),
+        Row(name='position_trajectory', address=140, size=4, default=None),
+        Row(name='present_input_voltage', address=144, size=2, default=None),
+        Row(name='present_temperature', address=146, size=1, default=None),
+        IndirectRow(name='indirect_address', addresses=[range(168, 224, 2), range(578, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(224, 252), range(634, 662)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(XH430_W350_T_R, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/xh540_v150_r.py b/dynamixel/model/xh540_v150_r.py
new file mode 100644
index 0000000..8aacad0
--- /dev/null
+++ b/dynamixel/model/xh540_v150_r.py
@@ -0,0 +1,69 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class XH540_V150_R(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=1150),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='secondary_id', address=12, size=1, default=255),
+        Row(name='protocol_type', address=13, size=1, default=2),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=10),
+        Row(name='temperature_limit', address=31, size=1, default=80),
+        Row(name='max_voltage_limit', address=32, size=2, default=300),
+        Row(name='min_voltage_limit', address=34, size=2, default=110),
+        Row(name='pwm_limit', address=36, size=2, default=885),
+        Row(name='current_limit', address=38, size=2, default=2047),
+        Row(name='velocity_limit', address=44, size=4, default=230),
+        Row(name='max_position_limit', address=48, size=4, default=4095),
+        Row(name='min_position_limit', address=52, size=4, default=0),
+        IndirectRow(name='external_port_mode', addresses=[range(56, 59)], size=1),
+        Row(name='shutdown', address=63, size=1, default=52)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=64, size=1, default=0),
+        Row(name='led', address=65, size=1, default=0),
+        Row(name='status_return_level', address=68, size=1, default=2),
+        Row(name='registered_instruction', address=69, size=1, default=0),
+        Row(name='hardware_error_status', address=70, size=1, default=0),
+        Row(name='velocity_i_gain', address=76, size=2, default=1920),
+        Row(name='velocity_p_gain', address=78, size=2, default=100),
+        Row(name='position_d_gain', address=80, size=2, default=0),
+        Row(name='position_i_gain', address=82, size=2, default=0),
+        Row(name='position_p_gain', address=84, size=2, default=800),
+        Row(name='feedforward_2nd_gain', address=88, size=2, default=0),
+        Row(name='feedforward_1st_gain', address=90, size=2, default=0),
+        Row(name='bus_watchdog', address=98, size=1, default=0),
+        Row(name='goal_pwm', address=100, size=2, default=None),
+        Row(name='goal_current', address=102, size=2, default=None),
+        Row(name='goal_velocity', address=104, size=4, default=None),
+        Row(name='profile_acceleration', address=108, size=4, default=0),
+        Row(name='profile_velocity', address=112, size=4, default=0),
+        Row(name='goal_position', address=116, size=4, default=None),
+        Row(name='realtime_tick', address=120, size=2, default=None),
+        Row(name='moving', address=122, size=1, default=0),
+        Row(name='moving_status', address=123, size=1, default=0),
+        Row(name='present_pwm', address=124, size=2, default=None),
+        Row(name='present_current', address=126, size=2, default=None),
+        Row(name='present_velocity', address=128, size=4, default=None),
+        Row(name='present_position', address=132, size=4, default=None),
+        Row(name='velocity_trajectory', address=136, size=4, default=None),
+        Row(name='position_trajectory', address=140, size=4, default=None),
+        Row(name='present_input_voltage', address=144, size=2, default=None),
+        Row(name='present_temperature', address=146, size=1, default=None),
+        IndirectRow(name='external_port_data', addresses=[range(152, 158, 2)], size=2),
+        IndirectRow(name='indirect_address', addresses=[range(168, 224, 2), range(578, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(224, 252), range(634, 662)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(XH540_V150_R, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/xh540_v270_r.py b/dynamixel/model/xh540_v270_r.py
new file mode 100644
index 0000000..d54166c
--- /dev/null
+++ b/dynamixel/model/xh540_v270_r.py
@@ -0,0 +1,69 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class XH540_V270_R(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=1140),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='secondary_id', address=12, size=1, default=255),
+        Row(name='protocol_type', address=13, size=1, default=2),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=10),
+        Row(name='temperature_limit', address=31, size=1, default=80),
+        Row(name='max_voltage_limit', address=32, size=2, default=300),
+        Row(name='min_voltage_limit', address=34, size=2, default=110),
+        Row(name='pwm_limit', address=36, size=2, default=885),
+        Row(name='current_limit', address=38, size=2, default=2047),
+        Row(name='velocity_limit', address=44, size=4, default=128),
+        Row(name='max_position_limit', address=48, size=4, default=4095),
+        Row(name='min_position_limit', address=52, size=4, default=0),
+        IndirectRow(name='external_port_mode', addresses=[range(56, 59)], size=1),
+        Row(name='shutdown', address=63, size=1, default=52)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=64, size=1, default=0),
+        Row(name='led', address=65, size=1, default=0),
+        Row(name='status_return_level', address=68, size=1, default=2),
+        Row(name='registered_instruction', address=69, size=1, default=0),
+        Row(name='hardware_error_status', address=70, size=1, default=0),
+        Row(name='velocity_i_gain', address=76, size=2, default=1920),
+        Row(name='velocity_p_gain', address=78, size=2, default=100),
+        Row(name='position_d_gain', address=80, size=2, default=0),
+        Row(name='position_i_gain', address=82, size=2, default=0),
+        Row(name='position_p_gain', address=84, size=2, default=800),
+        Row(name='feedforward_2nd_gain', address=88, size=2, default=0),
+        Row(name='feedforward_1st_gain', address=90, size=2, default=0),
+        Row(name='bus_watchdog', address=98, size=1, default=0),
+        Row(name='goal_pwm', address=100, size=2, default=None),
+        Row(name='goal_current', address=102, size=2, default=None),
+        Row(name='goal_velocity', address=104, size=4, default=None),
+        Row(name='profile_acceleration', address=108, size=4, default=0),
+        Row(name='profile_velocity', address=112, size=4, default=0),
+        Row(name='goal_position', address=116, size=4, default=None),
+        Row(name='realtime_tick', address=120, size=2, default=None),
+        Row(name='moving', address=122, size=1, default=0),
+        Row(name='moving_status', address=123, size=1, default=0),
+        Row(name='present_pwm', address=124, size=2, default=None),
+        Row(name='present_current', address=126, size=2, default=None),
+        Row(name='present_velocity', address=128, size=4, default=None),
+        Row(name='present_position', address=132, size=4, default=None),
+        Row(name='velocity_trajectory', address=136, size=4, default=None),
+        Row(name='position_trajectory', address=140, size=4, default=None),
+        Row(name='present_input_voltage', address=144, size=2, default=None),
+        Row(name='present_temperature', address=146, size=1, default=None),
+        IndirectRow(name='external_port_data', addresses=[range(152, 158, 2)], size=2),
+        IndirectRow(name='indirect_address', addresses=[range(168, 224, 2), range(578, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(224, 252), range(634, 662)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(XH540_V270_R, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/xh540_w150_t_r.py b/dynamixel/model/xh540_w150_t_r.py
new file mode 100644
index 0000000..68447a1
--- /dev/null
+++ b/dynamixel/model/xh540_w150_t_r.py
@@ -0,0 +1,69 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class XH540_W150_T_R(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=1110),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='secondary_id', address=12, size=1, default=255),
+        Row(name='protocol_type', address=13, size=1, default=2),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=10),
+        Row(name='temperature_limit', address=31, size=1, default=80),
+        Row(name='max_voltage_limit', address=32, size=2, default=160),
+        Row(name='min_voltage_limit', address=34, size=2, default=95),
+        Row(name='pwm_limit', address=36, size=2, default=885),
+        Row(name='current_limit', address=38, size=2, default=2047),
+        Row(name='velocity_limit', address=44, size=4, default=300),
+        Row(name='max_position_limit', address=48, size=4, default=4095),
+        Row(name='min_position_limit', address=52, size=4, default=0),
+        IndirectRow(name='external_port_mode', addresses=[range(56, 59)], size=1),
+        Row(name='shutdown', address=63, size=1, default=52)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=64, size=1, default=0),
+        Row(name='led', address=65, size=1, default=0),
+        Row(name='status_return_level', address=68, size=1, default=2),
+        Row(name='registered_instruction', address=69, size=1, default=0),
+        Row(name='hardware_error_status', address=70, size=1, default=0),
+        Row(name='velocity_i_gain', address=76, size=2, default=1920),
+        Row(name='velocity_p_gain', address=78, size=2, default=100),
+        Row(name='position_d_gain', address=80, size=2, default=0),
+        Row(name='position_i_gain', address=82, size=2, default=0),
+        Row(name='position_p_gain', address=84, size=2, default=800),
+        Row(name='feedforward_2nd_gain', address=88, size=2, default=0),
+        Row(name='feedforward_1st_gain', address=90, size=2, default=0),
+        Row(name='bus_watchdog', address=98, size=1, default=0),
+        Row(name='goal_pwm', address=100, size=2, default=None),
+        Row(name='goal_current', address=102, size=2, default=None),
+        Row(name='goal_velocity', address=104, size=4, default=None),
+        Row(name='profile_acceleration', address=108, size=4, default=0),
+        Row(name='profile_velocity', address=112, size=4, default=0),
+        Row(name='goal_position', address=116, size=4, default=None),
+        Row(name='realtime_tick', address=120, size=2, default=None),
+        Row(name='moving', address=122, size=1, default=0),
+        Row(name='moving_status', address=123, size=1, default=0),
+        Row(name='present_pwm', address=124, size=2, default=None),
+        Row(name='present_current', address=126, size=2, default=None),
+        Row(name='present_velocity', address=128, size=4, default=None),
+        Row(name='present_position', address=132, size=4, default=None),
+        Row(name='velocity_trajectory', address=136, size=4, default=None),
+        Row(name='position_trajectory', address=140, size=4, default=None),
+        Row(name='present_input_voltage', address=144, size=2, default=None),
+        Row(name='present_temperature', address=146, size=1, default=None),
+        IndirectRow(name='external_port_data', addresses=[range(152, 158, 2)], size=2),
+        IndirectRow(name='indirect_address', addresses=[range(168, 224, 2), range(578, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(224, 252), range(634, 662)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(XH540_W150_T_R, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/xh540_w270_t_r.py b/dynamixel/model/xh540_w270_t_r.py
new file mode 100644
index 0000000..5cb5457
--- /dev/null
+++ b/dynamixel/model/xh540_w270_t_r.py
@@ -0,0 +1,69 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class XH540_W270_T_R(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=1100),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='secondary_id', address=12, size=1, default=255),
+        Row(name='protocol_type', address=13, size=1, default=2),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=10),
+        Row(name='temperature_limit', address=31, size=1, default=80),
+        Row(name='max_voltage_limit', address=32, size=2, default=160),
+        Row(name='min_voltage_limit', address=34, size=2, default=95),
+        Row(name='pwm_limit', address=36, size=2, default=885),
+        Row(name='current_limit', address=38, size=2, default=2047),
+        Row(name='velocity_limit', address=44, size=4, default=167),
+        Row(name='max_position_limit', address=48, size=4, default=4095),
+        Row(name='min_position_limit', address=52, size=4, default=0),
+        IndirectRow(name='external_port_mode', addresses=[range(56, 59)], size=1),
+        Row(name='shutdown', address=63, size=1, default=52)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=64, size=1, default=0),
+        Row(name='led', address=65, size=1, default=0),
+        Row(name='status_return_level', address=68, size=1, default=2),
+        Row(name='registered_instruction', address=69, size=1, default=0),
+        Row(name='hardware_error_status', address=70, size=1, default=0),
+        Row(name='velocity_i_gain', address=76, size=2, default=1920),
+        Row(name='velocity_p_gain', address=78, size=2, default=100),
+        Row(name='position_d_gain', address=80, size=2, default=0),
+        Row(name='position_i_gain', address=82, size=2, default=0),
+        Row(name='position_p_gain', address=84, size=2, default=800),
+        Row(name='feedforward_2nd_gain', address=88, size=2, default=0),
+        Row(name='feedforward_1st_gain', address=90, size=2, default=0),
+        Row(name='bus_watchdog', address=98, size=1, default=0),
+        Row(name='goal_pwm', address=100, size=2, default=None),
+        Row(name='goal_current', address=102, size=2, default=None),
+        Row(name='goal_velocity', address=104, size=4, default=None),
+        Row(name='profile_acceleration', address=108, size=4, default=0),
+        Row(name='profile_velocity', address=112, size=4, default=0),
+        Row(name='goal_position', address=116, size=4, default=None),
+        Row(name='realtime_tick', address=120, size=2, default=None),
+        Row(name='moving', address=122, size=1, default=0),
+        Row(name='moving_status', address=123, size=1, default=0),
+        Row(name='present_pwm', address=124, size=2, default=None),
+        Row(name='present_current', address=126, size=2, default=None),
+        Row(name='present_velocity', address=128, size=4, default=None),
+        Row(name='present_position', address=132, size=4, default=None),
+        Row(name='velocity_trajectory', address=136, size=4, default=None),
+        Row(name='position_trajectory', address=140, size=4, default=None),
+        Row(name='present_input_voltage', address=144, size=2, default=None),
+        Row(name='present_temperature', address=146, size=1, default=None),
+        IndirectRow(name='external_port_data', addresses=[range(152, 158, 2)], size=2),
+        IndirectRow(name='indirect_address', addresses=[range(168, 224, 2), range(578, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(224, 252), range(634, 662)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(XH540_W270_T_R, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/xl430_w250_t.py b/dynamixel/model/xl430_w250_t.py
new file mode 100644
index 0000000..66a0e40
--- /dev/null
+++ b/dynamixel/model/xl430_w250_t.py
@@ -0,0 +1,65 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class XL430_W250_T(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=1060),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='secondary_id', address=12, size=1, default=255),
+        Row(name='protocol_type', address=13, size=1, default=2),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=10),
+        Row(name='temperature_limit', address=31, size=1, default=72),
+        Row(name='max_voltage_limit', address=32, size=2, default=140),
+        Row(name='min_voltage_limit', address=34, size=2, default=60),
+        Row(name='pwm_limit', address=36, size=2, default=885),
+        Row(name='velocity_limit', address=44, size=4, default=265),
+        Row(name='max_position_limit', address=48, size=4, default=4095),
+        Row(name='min_position_limit', address=52, size=4, default=0),
+        Row(name='shutdown', address=63, size=1, default=52)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=64, size=1, default=0),
+        Row(name='led', address=65, size=1, default=0),
+        Row(name='status_return_level', address=68, size=1, default=2),
+        Row(name='registered_instruction', address=69, size=1, default=0),
+        Row(name='hardware_error_status', address=70, size=1, default=0),
+        Row(name='velocity_i_gain', address=76, size=2, default=1000),
+        Row(name='velocity_p_gain', address=78, size=2, default=100),
+        Row(name='position_d_gain', address=80, size=2, default=4000),
+        Row(name='position_i_gain', address=82, size=2, default=0),
+        Row(name='position_p_gain', address=84, size=2, default=640),
+        Row(name='feedforward_2nd_gain', address=88, size=2, default=0),
+        Row(name='feedforward_1st_gain', address=90, size=2, default=0),
+        Row(name='bus_watchdog', address=98, size=1, default=0),
+        Row(name='goal_pwm', address=100, size=2, default=None),
+        Row(name='goal_velocity', address=104, size=4, default=None),
+        Row(name='profile_acceleration', address=108, size=4, default=0),
+        Row(name='profile_velocity', address=112, size=4, default=0),
+        Row(name='goal_position', address=116, size=4, default=None),
+        Row(name='realtime_tick', address=120, size=2, default=None),
+        Row(name='moving', address=122, size=1, default=0),
+        Row(name='moving_status', address=123, size=1, default=0),
+        Row(name='present_pwm', address=124, size=2, default=None),
+        Row(name='present_load', address=126, size=2, default=None),
+        Row(name='present_velocity', address=128, size=4, default=None),
+        Row(name='present_position', address=132, size=4, default=None),
+        Row(name='velocity_trajectory', address=136, size=4, default=None),
+        Row(name='position_trajectory', address=140, size=4, default=None),
+        Row(name='present_input_voltage', address=144, size=2, default=None),
+        Row(name='present_temperature', address=146, size=1, default=None),
+        IndirectRow(name='indirect_address', addresses=[range(168, 224, 2), range(578, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(224, 252), range(634, 662)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(XL430_W250_T, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/xl_320.py b/dynamixel/model/xl_320.py
new file mode 100644
index 0000000..fc3e80f
--- /dev/null
+++ b/dynamixel/model/xl_320.py
@@ -0,0 +1,45 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class XL_320(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=350),
+        Row(name='firmware_version', address=2, size=1, default=None),
+        Row(name='id', address=3, size=1, default=1),
+        Row(name='baud_rate', address=4, size=1, default=3),
+        Row(name='return_delay_time', address=5, size=1, default=250),
+        Row(name='cw_angle_limit', address=6, size=2, default=0),
+        Row(name='ccw_angle_limit', address=8, size=2, default=1023),
+        Row(name='control_mode', address=11, size=1, default=2),
+        Row(name='temperature_limit', address=12, size=1, default=65),
+        Row(name='min_voltage_limit', address=13, size=1, default=60),
+        Row(name='max_voltage_limit', address=14, size=1, default=90),
+        Row(name='max_torque', address=15, size=2, default=1023),
+        Row(name='status_return_level', address=17, size=1, default=2),
+        Row(name='shutdown', address=18, size=1, default=3)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=24, size=1, default=0),
+        Row(name='led', address=25, size=1, default=0),
+        Row(name='d_gain', address=27, size=1, default=0),
+        Row(name='i_gain', address=28, size=1, default=0),
+        Row(name='p_gain', address=29, size=1, default=32),
+        Row(name='goal_position', address=30, size=2, default=None),
+        Row(name='moving_speed', address=32, size=2, default=None),
+        Row(name='torque_limit', address=35, size=2, default=None),
+        Row(name='present_position', address=37, size=2, default=None),
+        Row(name='present_speed', address=39, size=2, default=None),
+        Row(name='present_load', address=41, size=2, default=None),
+        Row(name='present_voltage', address=45, size=1, default=None),
+        Row(name='present_temperature', address=46, size=1, default=None),
+        Row(name='registered', address=47, size=1, default=0),
+        Row(name='moving', address=49, size=1, default=0),
+        Row(name='hardware_error_status', address=50, size=1, default=0),
+        Row(name='punch', address=51, size=2, default=32)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(XL_320, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/xm430_w210_t_r.py b/dynamixel/model/xm430_w210_t_r.py
new file mode 100644
index 0000000..8fd374f
--- /dev/null
+++ b/dynamixel/model/xm430_w210_t_r.py
@@ -0,0 +1,67 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class XM430_W210_T_R(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=1030),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='secondary_id', address=12, size=1, default=255),
+        Row(name='protocol_type', address=13, size=1, default=2),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=10),
+        Row(name='temperature_limit', address=31, size=1, default=80),
+        Row(name='max_voltage_limit', address=32, size=2, default=160),
+        Row(name='min_voltage_limit', address=34, size=2, default=95),
+        Row(name='pwm_limit', address=36, size=2, default=885),
+        Row(name='current_limit', address=38, size=2, default=1193),
+        Row(name='velocity_limit', address=44, size=4, default=330),
+        Row(name='max_position_limit', address=48, size=4, default=4095),
+        Row(name='min_position_limit', address=52, size=4, default=0),
+        Row(name='shutdown', address=63, size=1, default=52)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=64, size=1, default=0),
+        Row(name='led', address=65, size=1, default=0),
+        Row(name='status_return_level', address=68, size=1, default=2),
+        Row(name='registered_instruction', address=69, size=1, default=0),
+        Row(name='hardware_error_status', address=70, size=1, default=0),
+        Row(name='velocity_i_gain', address=76, size=2, default=1920),
+        Row(name='velocity_p_gain', address=78, size=2, default=100),
+        Row(name='position_d_gain', address=80, size=2, default=0),
+        Row(name='position_i_gain', address=82, size=2, default=0),
+        Row(name='position_p_gain', address=84, size=2, default=800),
+        Row(name='feedforward_2nd_gain', address=88, size=2, default=0),
+        Row(name='feedforward_1st_gain', address=90, size=2, default=0),
+        Row(name='bus_watchdog', address=98, size=1, default=0),
+        Row(name='goal_pwm', address=100, size=2, default=None),
+        Row(name='goal_current', address=102, size=2, default=None),
+        Row(name='goal_velocity', address=104, size=4, default=None),
+        Row(name='profile_acceleration', address=108, size=4, default=0),
+        Row(name='profile_velocity', address=112, size=4, default=0),
+        Row(name='goal_position', address=116, size=4, default=None),
+        Row(name='realtime_tick', address=120, size=2, default=None),
+        Row(name='moving', address=122, size=1, default=0),
+        Row(name='moving_status', address=123, size=1, default=0),
+        Row(name='present_pwm', address=124, size=2, default=None),
+        Row(name='present_current', address=126, size=2, default=None),
+        Row(name='present_velocity', address=128, size=4, default=None),
+        Row(name='present_position', address=132, size=4, default=None),
+        Row(name='velocity_trajectory', address=136, size=4, default=None),
+        Row(name='position_trajectory', address=140, size=4, default=None),
+        Row(name='present_input_voltage', address=144, size=2, default=None),
+        Row(name='present_temperature', address=146, size=1, default=None),
+        IndirectRow(name='indirect_address', addresses=[range(168, 224, 2), range(578, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(224, 252), range(634, 662)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(XM430_W210_T_R, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/xm430_w350_t_r.py b/dynamixel/model/xm430_w350_t_r.py
new file mode 100644
index 0000000..9c16b6c
--- /dev/null
+++ b/dynamixel/model/xm430_w350_t_r.py
@@ -0,0 +1,67 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class XM430_W350_T_R(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=1020),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='secondary_id', address=12, size=1, default=255),
+        Row(name='protocol_type', address=13, size=1, default=2),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=10),
+        Row(name='temperature_limit', address=31, size=1, default=80),
+        Row(name='max_voltage_limit', address=32, size=2, default=160),
+        Row(name='min_voltage_limit', address=34, size=2, default=95),
+        Row(name='pwm_limit', address=36, size=2, default=885),
+        Row(name='current_limit', address=38, size=2, default=1193),
+        Row(name='velocity_limit', address=44, size=4, default=200),
+        Row(name='max_position_limit', address=48, size=4, default=4095),
+        Row(name='min_position_limit', address=52, size=4, default=0),
+        Row(name='shutdown', address=63, size=1, default=52)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=64, size=1, default=0),
+        Row(name='led', address=65, size=1, default=0),
+        Row(name='status_return_level', address=68, size=1, default=2),
+        Row(name='registered_instruction', address=69, size=1, default=0),
+        Row(name='hardware_error_status', address=70, size=1, default=0),
+        Row(name='velocity_i_gain', address=76, size=2, default=1920),
+        Row(name='velocity_p_gain', address=78, size=2, default=100),
+        Row(name='position_d_gain', address=80, size=2, default=0),
+        Row(name='position_i_gain', address=82, size=2, default=0),
+        Row(name='position_p_gain', address=84, size=2, default=800),
+        Row(name='feedforward_2nd_gain', address=88, size=2, default=0),
+        Row(name='feedforward_1st_gain', address=90, size=2, default=0),
+        Row(name='bus_watchdog', address=98, size=1, default=0),
+        Row(name='goal_pwm', address=100, size=2, default=None),
+        Row(name='goal_current', address=102, size=2, default=None),
+        Row(name='goal_velocity', address=104, size=4, default=None),
+        Row(name='profile_acceleration', address=108, size=4, default=0),
+        Row(name='profile_velocity', address=112, size=4, default=0),
+        Row(name='goal_position', address=116, size=4, default=None),
+        Row(name='realtime_tick', address=120, size=2, default=None),
+        Row(name='moving', address=122, size=1, default=0),
+        Row(name='moving_status', address=123, size=1, default=0),
+        Row(name='present_pwm', address=124, size=2, default=None),
+        Row(name='present_current', address=126, size=2, default=None),
+        Row(name='present_velocity', address=128, size=4, default=None),
+        Row(name='present_position', address=132, size=4, default=None),
+        Row(name='velocity_trajectory', address=136, size=4, default=None),
+        Row(name='position_trajectory', address=140, size=4, default=None),
+        Row(name='present_input_voltage', address=144, size=2, default=None),
+        Row(name='present_temperature', address=146, size=1, default=None),
+        IndirectRow(name='indirect_address', addresses=[range(168, 224, 2), range(578, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(224, 252), range(634, 662)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(XM430_W350_T_R, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/xm540_w150_t_r.py b/dynamixel/model/xm540_w150_t_r.py
new file mode 100644
index 0000000..668d68f
--- /dev/null
+++ b/dynamixel/model/xm540_w150_t_r.py
@@ -0,0 +1,69 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class XM540_W150_T_R(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=1130),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='secondary_id', address=12, size=1, default=255),
+        Row(name='protocol_type', address=13, size=1, default=2),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=10),
+        Row(name='temperature_limit', address=31, size=1, default=80),
+        Row(name='max_voltage_limit', address=32, size=2, default=160),
+        Row(name='min_voltage_limit', address=34, size=2, default=95),
+        Row(name='pwm_limit', address=36, size=2, default=885),
+        Row(name='current_limit', address=38, size=2, default=2047),
+        Row(name='velocity_limit', address=44, size=4, default=230),
+        Row(name='max_position_limit', address=48, size=4, default=4095),
+        Row(name='min_position_limit', address=52, size=4, default=0),
+        IndirectRow(name='external_port_mode', addresses=[range(56, 59)], size=1),
+        Row(name='shutdown', address=63, size=1, default=52)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=64, size=1, default=0),
+        Row(name='led', address=65, size=1, default=0),
+        Row(name='status_return_level', address=68, size=1, default=2),
+        Row(name='registered_instruction', address=69, size=1, default=0),
+        Row(name='hardware_error_status', address=70, size=1, default=0),
+        Row(name='velocity_i_gain', address=76, size=2, default=1920),
+        Row(name='velocity_p_gain', address=78, size=2, default=100),
+        Row(name='position_d_gain', address=80, size=2, default=0),
+        Row(name='position_i_gain', address=82, size=2, default=0),
+        Row(name='position_p_gain', address=84, size=2, default=800),
+        Row(name='feedforward_2nd_gain', address=88, size=2, default=0),
+        Row(name='feedforward_1st_gain', address=90, size=2, default=0),
+        Row(name='bus_watchdog', address=98, size=1, default=0),
+        Row(name='goal_pwm', address=100, size=2, default=None),
+        Row(name='goal_current', address=102, size=2, default=None),
+        Row(name='goal_velocity', address=104, size=4, default=None),
+        Row(name='profile_acceleration', address=108, size=4, default=0),
+        Row(name='profile_velocity', address=112, size=4, default=0),
+        Row(name='goal_position', address=116, size=4, default=None),
+        Row(name='realtime_tick', address=120, size=2, default=None),
+        Row(name='moving', address=122, size=1, default=0),
+        Row(name='moving_status', address=123, size=1, default=0),
+        Row(name='present_pwm', address=124, size=2, default=None),
+        Row(name='present_current', address=126, size=2, default=None),
+        Row(name='present_velocity', address=128, size=4, default=None),
+        Row(name='present_position', address=132, size=4, default=None),
+        Row(name='velocity_trajectory', address=136, size=4, default=None),
+        Row(name='position_trajectory', address=140, size=4, default=None),
+        Row(name='present_input_voltage', address=144, size=2, default=None),
+        Row(name='present_temperature', address=146, size=1, default=None),
+        IndirectRow(name='external_port_data', addresses=[range(152, 158, 2)], size=2),
+        IndirectRow(name='indirect_address', addresses=[range(168, 224, 2), range(578, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(224, 252), range(634, 662)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(XM540_W150_T_R, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/xm540_w270_t_r.py b/dynamixel/model/xm540_w270_t_r.py
new file mode 100644
index 0000000..4247363
--- /dev/null
+++ b/dynamixel/model/xm540_w270_t_r.py
@@ -0,0 +1,69 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class XM540_W270_T_R(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=1120),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='secondary_id', address=12, size=1, default=255),
+        Row(name='protocol_type', address=13, size=1, default=2),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=10),
+        Row(name='temperature_limit', address=31, size=1, default=80),
+        Row(name='max_voltage_limit', address=32, size=2, default=160),
+        Row(name='min_voltage_limit', address=34, size=2, default=95),
+        Row(name='pwm_limit', address=36, size=2, default=885),
+        Row(name='current_limit', address=38, size=2, default=2047),
+        Row(name='velocity_limit', address=44, size=4, default=128),
+        Row(name='max_position_limit', address=48, size=4, default=4095),
+        Row(name='min_position_limit', address=52, size=4, default=0),
+        IndirectRow(name='external_port_mode', addresses=[range(56, 59)], size=1),
+        Row(name='shutdown', address=63, size=1, default=52)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=64, size=1, default=0),
+        Row(name='led', address=65, size=1, default=0),
+        Row(name='status_return_level', address=68, size=1, default=2),
+        Row(name='registered_instruction', address=69, size=1, default=0),
+        Row(name='hardware_error_status', address=70, size=1, default=0),
+        Row(name='velocity_i_gain', address=76, size=2, default=1920),
+        Row(name='velocity_p_gain', address=78, size=2, default=100),
+        Row(name='position_d_gain', address=80, size=2, default=0),
+        Row(name='position_i_gain', address=82, size=2, default=0),
+        Row(name='position_p_gain', address=84, size=2, default=800),
+        Row(name='feedforward_2nd_gain', address=88, size=2, default=0),
+        Row(name='feedforward_1st_gain', address=90, size=2, default=0),
+        Row(name='bus_watchdog', address=98, size=1, default=0),
+        Row(name='goal_pwm', address=100, size=2, default=None),
+        Row(name='goal_current', address=102, size=2, default=None),
+        Row(name='goal_velocity', address=104, size=4, default=None),
+        Row(name='profile_acceleration', address=108, size=4, default=0),
+        Row(name='profile_velocity', address=112, size=4, default=0),
+        Row(name='goal_position', address=116, size=4, default=None),
+        Row(name='realtime_tick', address=120, size=2, default=None),
+        Row(name='moving', address=122, size=1, default=0),
+        Row(name='moving_status', address=123, size=1, default=0),
+        Row(name='present_pwm', address=124, size=2, default=None),
+        Row(name='present_current', address=126, size=2, default=None),
+        Row(name='present_velocity', address=128, size=4, default=None),
+        Row(name='present_position', address=132, size=4, default=None),
+        Row(name='velocity_trajectory', address=136, size=4, default=None),
+        Row(name='position_trajectory', address=140, size=4, default=None),
+        Row(name='present_input_voltage', address=144, size=2, default=None),
+        Row(name='present_temperature', address=146, size=1, default=None),
+        IndirectRow(name='external_port_data', addresses=[range(152, 158, 2)], size=2),
+        IndirectRow(name='indirect_address', addresses=[range(168, 224, 2), range(578, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(224, 252), range(634, 662)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(XM540_W270_T_R, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/xw540_t140_r.py b/dynamixel/model/xw540_t140_r.py
new file mode 100644
index 0000000..b54630f
--- /dev/null
+++ b/dynamixel/model/xw540_t140_r.py
@@ -0,0 +1,66 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class XW540_T140_R(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=1180),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='secondary_id', address=12, size=1, default=255),
+        Row(name='protocol_type', address=13, size=1, default=2),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=10),
+        Row(name='temperature_limit', address=31, size=1, default=80),
+        Row(name='max_voltage_limit', address=32, size=2, default=160),
+        Row(name='min_voltage_limit', address=34, size=2, default=95),
+        Row(name='pwm_limit', address=36, size=2, default=885),
+        Row(name='current_limit', address=38, size=2, default=2047),
+        Row(name='velocity_limit', address=44, size=4, default=304),
+        Row(name='max_position_limit', address=48, size=4, default=4095),
+        Row(name='min_position_limit', address=52, size=4, default=0),
+        Row(name='shutdown', address=63, size=1, default=52)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=64, size=1, default=0),
+        Row(name='status_return_level', address=68, size=1, default=2),
+        Row(name='registered_instruction', address=69, size=1, default=0),
+        Row(name='hardware_error_status', address=70, size=1, default=0),
+        Row(name='velocity_i_gain', address=76, size=2, default=1920),
+        Row(name='velocity_p_gain', address=78, size=2, default=100),
+        Row(name='position_d_gain', address=80, size=2, default=0),
+        Row(name='position_i_gain', address=82, size=2, default=0),
+        Row(name='position_p_gain', address=84, size=2, default=800),
+        Row(name='feedforward_2nd_gain', address=88, size=2, default=0),
+        Row(name='feedforward_1st_gain', address=90, size=2, default=0),
+        Row(name='bus_watchdog', address=98, size=1, default=0),
+        Row(name='goal_pwm', address=100, size=2, default=None),
+        Row(name='goal_current', address=102, size=2, default=None),
+        Row(name='goal_velocity', address=104, size=4, default=None),
+        Row(name='profile_acceleration', address=108, size=4, default=0),
+        Row(name='profile_velocity', address=112, size=4, default=0),
+        Row(name='goal_position', address=116, size=4, default=None),
+        Row(name='realtime_tick', address=120, size=2, default=None),
+        Row(name='moving', address=122, size=1, default=0),
+        Row(name='moving_status', address=123, size=1, default=0),
+        Row(name='present_pwm', address=124, size=2, default=None),
+        Row(name='present_current', address=126, size=2, default=None),
+        Row(name='present_velocity', address=128, size=4, default=None),
+        Row(name='present_position', address=132, size=4, default=None),
+        Row(name='velocity_trajectory', address=136, size=4, default=None),
+        Row(name='position_trajectory', address=140, size=4, default=None),
+        Row(name='present_input_voltage', address=144, size=2, default=None),
+        Row(name='present_temperature', address=146, size=1, default=None),
+        IndirectRow(name='indirect_address', addresses=[range(168, 224, 2), range(578, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(224, 252), range(634, 662)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(XW540_T140_R, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/model/xw540_t260_r.py b/dynamixel/model/xw540_t260_r.py
new file mode 100644
index 0000000..3dfb867
--- /dev/null
+++ b/dynamixel/model/xw540_t260_r.py
@@ -0,0 +1,66 @@
+
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class XW540_T260_R(Servo):
+    EEPROM = [
+        Row(name='model_number', address=0, size=2, default=1170),
+        Row(name='model_information', address=2, size=4, default=None),
+        Row(name='firmware_version', address=6, size=1, default=None),
+        Row(name='id', address=7, size=1, default=1),
+        Row(name='baud_rate', address=8, size=1, default=1),
+        Row(name='return_delay_time', address=9, size=1, default=250),
+        Row(name='drive_mode', address=10, size=1, default=0),
+        Row(name='operating_mode', address=11, size=1, default=3),
+        Row(name='secondary_id', address=12, size=1, default=255),
+        Row(name='protocol_type', address=13, size=1, default=2),
+        Row(name='homing_offset', address=20, size=4, default=0),
+        Row(name='moving_threshold', address=24, size=4, default=10),
+        Row(name='temperature_limit', address=31, size=1, default=80),
+        Row(name='max_voltage_limit', address=32, size=2, default=160),
+        Row(name='min_voltage_limit', address=34, size=2, default=95),
+        Row(name='pwm_limit', address=36, size=2, default=885),
+        Row(name='current_limit', address=38, size=2, default=2047),
+        Row(name='velocity_limit', address=44, size=4, default=167),
+        Row(name='max_position_limit', address=48, size=4, default=4095),
+        Row(name='min_position_limit', address=52, size=4, default=0),
+        Row(name='shutdown', address=63, size=1, default=52)
+    ]
+    RAM = [
+        Row(name='torque_enable', address=64, size=1, default=0),
+        Row(name='status_return_level', address=68, size=1, default=2),
+        Row(name='registered_instruction', address=69, size=1, default=0),
+        Row(name='hardware_error_status', address=70, size=1, default=0),
+        Row(name='velocity_i_gain', address=76, size=2, default=1920),
+        Row(name='velocity_p_gain', address=78, size=2, default=100),
+        Row(name='position_d_gain', address=80, size=2, default=0),
+        Row(name='position_i_gain', address=82, size=2, default=0),
+        Row(name='position_p_gain', address=84, size=2, default=800),
+        Row(name='feedforward_2nd_gain', address=88, size=2, default=0),
+        Row(name='feedforward_1st_gain', address=90, size=2, default=0),
+        Row(name='bus_watchdog', address=98, size=1, default=0),
+        Row(name='goal_pwm', address=100, size=2, default=None),
+        Row(name='goal_current', address=102, size=2, default=None),
+        Row(name='goal_velocity', address=104, size=4, default=None),
+        Row(name='profile_acceleration', address=108, size=4, default=0),
+        Row(name='profile_velocity', address=112, size=4, default=0),
+        Row(name='goal_position', address=116, size=4, default=None),
+        Row(name='realtime_tick', address=120, size=2, default=None),
+        Row(name='moving', address=122, size=1, default=0),
+        Row(name='moving_status', address=123, size=1, default=0),
+        Row(name='present_pwm', address=124, size=2, default=None),
+        Row(name='present_current', address=126, size=2, default=None),
+        Row(name='present_velocity', address=128, size=4, default=None),
+        Row(name='present_position', address=132, size=4, default=None),
+        Row(name='velocity_trajectory', address=136, size=4, default=None),
+        Row(name='position_trajectory', address=140, size=4, default=None),
+        Row(name='present_input_voltage', address=144, size=2, default=None),
+        Row(name='present_temperature', address=146, size=1, default=None),
+        IndirectRow(name='indirect_address', addresses=[range(168, 224, 2), range(578, 634, 2)], size=2),
+        IndirectRow(name='indirect_data', addresses=[range(224, 252), range(634, 662)], size=1)
+    ]
+    PROTOCOL = dynamixel.protocol.Protocol2
+
+    def __init__(self, id):
+        super(XW540_T260_R, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
diff --git a/dynamixel/protocol/Protocol2.py b/dynamixel/protocol/Protocol2.py
new file mode 100644
index 0000000..e4fbcd3
--- /dev/null
+++ b/dynamixel/protocol/Protocol2.py
@@ -0,0 +1,2 @@
+class Protocol2:
+    pass
diff --git a/dynamixel/protocol/__init__.py b/dynamixel/protocol/__init__.py
new file mode 100644
index 0000000..27f95fa
--- /dev/null
+++ b/dynamixel/protocol/__init__.py
@@ -0,0 +1 @@
+from . import Protocol2
diff --git a/dynamixel/servo/__init__.py b/dynamixel/servo/__init__.py
new file mode 100644
index 0000000..ca0b806
--- /dev/null
+++ b/dynamixel/servo/__init__.py
@@ -0,0 +1,30 @@
+class Servo:
+    def __init__(self, id, eeprom, ram, protocol):
+        self._id = id
+        self._control_table = dict(
+            [ (r.name, r) for r in eeprom ] +
+            [ (r.name, r) for r in ram ]
+        )
+        self.protocol = protocol
+        pass
+
+    pass
+
+class Row:
+
+    def __init__(self, name, address, size, default):
+        self.name = name
+        self.address = address
+        self.size = size
+        self.default = default
+        pass
+    
+    pass
+
+class IndirectRow:
+    def __init__(self, name, addresses, size):
+        self.name = name
+        self.addresses = addresses
+        self.size = size
+       
+    pass
diff --git a/tools/html2desc.py b/tools/html2desc.py
new file mode 100755
index 0000000..c9afa6b
--- /dev/null
+++ b/tools/html2desc.py
@@ -0,0 +1,265 @@
+#!/usr/bin/python3
+
+import sys
+import lxml.etree
+import re
+
+def extract_row(tr, name_to_index):
+    def text(e, report_error):
+        # Transform HTML to text
+        result = ''
+        if e.tag == 'br':
+            result += '\n'
+            pass
+        elif e.tag == 'sup':
+            result += '^'
+            result += e.text or ''
+            pass
+        else:
+            result += e.text or ''
+            pass
+        if len(e):
+            result += ''.join([ text(e1, report_error) for e1 in e ])
+            pass
+        result += e.tail or ''
+        return result
+    
+    def get(key, report_error=True):
+        try:
+            index = name_to_index[key]
+            return text(tr[index], report_error).rstrip()
+        except KeyError as e:
+            if report_error:
+                print(e, name_to_index)
+                raise
+            return None
+        pass
+
+    name = get('Data Name')
+    address = get('Address')
+    size = get('Size')
+    access = get('Access')
+    default = (get('Initial', False) or get('Default')).replace(',', '')
+    ranges = get('Range', False)
+    if ranges == None:
+        # Try with min ~ max
+        rmin = get('Min', False)
+        rmax = get('Max', False)
+        if not rmin in [ None, '-'] and not rmax in [ None, '-' ]:
+            ranges = "%s ~ %s" % (rmin, rmax)
+            pass
+        pass
+    unit = get('Unit', False)
+    return name, address, size, access, default, ranges, unit
+    
+
+class Row:
+
+    def __init__(self, name, index, address, size, access, default,
+                 ranges, unit):
+        self.name = name
+        self.index = int(index) if index else None
+        self.address = address
+        self.size = size
+        self.access = access
+        self.default = default
+        self.ranges = ranges
+        self.unit = unit
+        pass
+
+    def __getitem__(self, key):
+        return getattr(self,key)
+    
+    def __repr__(self):
+        return "Row(%s)" % ([self.name, self.index, self.address, self.size,
+                             self.access, self.default, self.ranges, self.unit])
+
+class ParsedRow(Row):
+
+    def __init__(self, tr, name_to_index):
+        (name, address, size, access, default,
+         ranges, unit) = extract_row(tr, name_to_index)
+        m = re.match('^([a-z_][a-z0-9_]*[a-z_])(?:_([0-9]+))?$',
+                     name.lower()
+                     .replace(' ', '_')
+                     .replace('(shadow)', ''))
+        if not (m and address.isdigit()):
+            raise ValueError((name, address, size, access, default,
+                              ranges, unit))
+        super(ParsedRow, self).__init__(
+            name=m.group(1),
+            index=m.group(2),
+            address=int(address),
+            size=int(size),
+            access=set(access),
+            default=int(default) if default.isdigit() else None,
+            ranges=ranges,
+            unit=unit)
+
+    def range(self, end):
+        N = end.index - self.index
+        adress_step = (end.address - self.address) / N
+        default_step = (end.default - self.default) / N
+        for i in range(1, N):
+            yield Row(self.name, self.index + i,
+                      int(self.address + i*adress_step),
+                      self.size, self.access,
+                      int(self.default + i*default_step),
+                      self.ranges, self.unit)
+        pass
+        
+
+        
+class Table:
+
+    def __init__(self, table):
+        self.row = {}
+        name_to_index = dict([ (e.text, i) for i,e in enumerate(table[0][0]) ])
+        for i,tr in enumerate(table[1]):
+            try:
+                row = ParsedRow(tr, name_to_index)
+                self.add(row)
+                pass
+            except ValueError:
+                r1 = ParsedRow(table[1][i-1], name_to_index)
+                r2 = ParsedRow(table[1][i+1], name_to_index)
+                for r in r1.range(r2):
+                    self.add(r)
+                    pass
+                pass
+            pass
+        pass
+
+    def add(self, row):
+        if row.index == None:
+            # Ordinary row
+            self.row[row.name] = row
+            pass
+        else:
+            # Indirect row
+            if not row.name in self.row:
+                self.row[row.name] = {}
+                pass
+            self.row[row.name][row.index] = row
+            pass
+        pass
+
+    def __iter__(self):
+        def key(r):
+            if isinstance(r[1], dict):
+                # Sort indirect registers on first 
+                return min([ r.address for r in r[1].values() ])
+            return r[1].address
+        for k,v in sorted(self.row.items(), key=key):
+            yield v
+            pass
+        pass
+    
+    pass
+
+def Parse(path):
+    et = lxml.etree.HTML(open(path).read())
+    title = None
+    table = {}
+    protocol = set()
+    id = None
+    def traverse(t):
+        nonlocal title
+        nonlocal table
+        nonlocal protocol
+        nonlocal id
+        for st in t:
+            if st.tag == 'title':
+                # Save product name
+                title = (st.text
+                         .replace('/', '_')
+                         .replace('(', '_')
+                         .replace(')', ''))
+                pass
+            elif st.tag == 'table':
+                # Only save control tables
+                if id.startswith('control-table'):
+                    table[id] = Table(st)
+                    pass
+                pass
+            elif (st.tag == 'a' and id == 'control-table-data-address' and
+                  (m := re.match('^.*/(protocol[^/]+).*$', st.get('href')))):
+                protocol.add(m.group(1).replace('protocol', 'Protocol'))
+            else:
+                id = st.get('id') or id
+                traverse(st)
+                pass
+            pass
+        pass
+    traverse(et)
+    return(title, table, protocol)
+
+for path in sys.argv[1:]:
+    EEPROM = {}
+    RAM = {}
+    title, tables, protocol = Parse(path)
+    print(title, protocol)
+    if  re.match('^[A-X0-9]*-.*$', title):
+        EEPROM[title] = tables['control-table-of-eeprom-area']
+        RAM[title] = tables['control-table-of-ram-area']
+        pass
+    for model in sorted(EEPROM):
+        with open("dynamixel/model/%s.py" % (model.lower().replace('-', '_')),
+                  'w') as f:
+            def expand_indirect_row(r):
+                def ranges(r):
+                    size = r[1].size
+                    current = None
+                    start = None
+                    for k,v in sorted(r.items()):
+                        if current == None:
+                            start = v.address
+                            pass
+                        elif current + size != v.address:
+                            yield range(start, current + size, size)
+                            start = v.address
+                            pass
+                        current = v.address
+                        pass
+                    yield range(start, current + size, size)
+                    pass
+                return (f"IndirectRow(name='{r[1].name}', "
+                        f"addresses={list(ranges(r))}, "
+                        f"size={r[1].size})")
+            def expand_row(r):
+                if isinstance(r, dict):
+                    return expand_indirect_row(r)
+                    pass
+                else:
+                    return (f"Row(name='{r.name}', "
+                            f"address={r.address}, "
+                            f"size={r.size}, default={r.default})")
+                    pass
+                
+            def expand_table(t):
+                for r in t:
+                    yield expand_row(r)
+                    pass
+                pass
+            py_model = model.replace('-', '_')
+            indent = ',\n        '
+            f.write(f'''
+from dynamixel.servo import Servo, Row, IndirectRow
+import dynamixel.protocol
+
+class {py_model}(Servo):
+    EEPROM = [
+        {indent.join(expand_table(EEPROM[model]))}
+    ]
+    RAM = [
+        {indent.join(expand_table(RAM[model]))}
+    ]
+    PROTOCOL = dynamixel.protocol.{max(protocol)}
+
+    def __init__(self, id):
+        super({py_model}, self).__init__(
+            id=id, eeprom=self.EEPROM, ram=self.RAM, protocol=self.PROTOCOL)
+''')
+            pass
+        pass
+    pass
-- 
GitLab