diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 104a60d72e69effbd35a142abc1b618e096c136d..15f5b02b3f9a37f6fc2b1a4135b500d77ad7dae7 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,9 +1,9 @@
 ADD_SUBDIRECTORY(xml)
 
 # edit the following line to add all the source code files of the library
-SET(sources dynamixel.cpp dynamixelserver.cpp dynamixelserver_ftdi.cpp dynamixelserver_serial.cpp dynamixelexceptions.cpp dynamixel_slave.cpp dynamixel_slave_ftdi.cpp)
+SET(sources dynamixel.cpp dynamixelserver.cpp dynamixelserver_ftdi.cpp dynamixelserver_serial.cpp dynamixelexceptions.cpp dynamixel_slave.cpp dynamixel_slave_ftdi.cpp dynamixel_slave_serial.cpp)
 # edit the following line to add all the header files of the library
-SET(headers dynamixel.h dynamixelserver.h dynamixelserver_ftdi.h dynamixelserver_serial.h dynamixelexceptions.h dynamixel_common.h)
+SET(headers dynamixel.h dynamixelserver.h dynamixelserver_ftdi.h dynamixelserver_serial.h dynamixelexceptions.h dynamixel_common.h dynamixel_slave.h dynamixel_slave_ftdi.h dynamixel_slave_serial.h)
 
 INCLUDE_DIRECTORIES(.)
 
diff --git a/src/dynamixel_slave.cpp b/src/dynamixel_slave.cpp
index 7773dd703c5cea0cc7e856a294a16ca743f63b33..d5b12075db9f3d034eb5f44ae9d02f60dab59707 100644
--- a/src/dynamixel_slave.cpp
+++ b/src/dynamixel_slave.cpp
@@ -7,7 +7,7 @@ CDynamixelSlave::CDynamixelSlave(const std::string& cont_id,dyn_version_t dyn_ve
   this->new_packet_available_event_id=cont_id + "new_packet_event_id";
   this->event_server->create_event(this->new_packet_available_event_id);
   this->finish_thread_event_id=cont_id + "finish_thread_event_id";
-  this->event_server->create_event(this->new_packet_available_event_id);
+  this->event_server->create_event(this->finish_thread_event_id);
 
   this->thread_server=CThreadServer::instance();
   this->process_packets_thread_id=cont_id + "_thread_id";
@@ -42,8 +42,8 @@ void *CDynamixelSlave::process_packets_thread(void *params)
     slave->comm_access.exit();
   }
   end=false;
+  events.push_back(slave->finish_thread_event_id);
   events.push_back(slave->comm_dev->get_rx_event_id());
-  events.push_back(slave->new_packet_available_event_id);
   while(!end)
   {
     event_index=slave->event_server->wait_first(events);
@@ -53,6 +53,7 @@ void *CDynamixelSlave::process_packets_thread(void *params)
     {
       // process the incomming data
       num=slave->comm_dev->get_num_data();
+      std::cout << "num data: " << num << std::endl;
       data=new unsigned char[num];
       if(slave->comm_dev->read(data,num)!=num)
         std::cout << "Error while reading the communication device" << std::endl;
@@ -60,6 +61,7 @@ void *CDynamixelSlave::process_packets_thread(void *params)
       {
         for(i=0;i<num;i++)
 	{
+          std::cout << std::hex << (int)data[i] << std::endl;
           if(!data_phase)
           {
             switch(num_bytes)
diff --git a/src/dynamixel_slave_serial.cpp b/src/dynamixel_slave_serial.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..8d6bd4182293dd2eef7aa4116e06588ff2bb3814
--- /dev/null
+++ b/src/dynamixel_slave_serial.cpp
@@ -0,0 +1,56 @@
+#include "dynamixelexceptions.h"
+#include "dynamixel_slave_serial.h"
+#include "eventexceptions.h"
+#include "rs232.h"
+#include <sstream>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+CDynamixelSlaveSerial::CDynamixelSlaveSerial(const std::string& cont_id,const std::string &device,dyn_version_t dyn_ver):CDynamixelSlave(cont_id,dyn_ver)
+{
+  TRS232_config serial_config;
+
+  this->bus_info.baud_rate=-1;
+  this->bus_info.device="";
+  this->comm_dev=new CRS232(cont_id);
+  this->comm_dev->open((void *)&device);
+  this->bus_info.device=device;
+  serial_config.baud=921600;
+  serial_config.num_bits=8;
+  serial_config.parity=none;
+  serial_config.stop_bits=1;
+  this->comm_dev->config(&serial_config);
+  this->bus_info.baud_rate=921600;
+  ((CRS232 *)this->comm_dev)->clear_control_signal(rs232_dtr);
+  this->start();
+}
+
+int CDynamixelSlaveSerial::get_baudrate(void)
+{
+  return this->bus_info.baud_rate;
+}
+
+void CDynamixelSlaveSerial::set_baudrate(int baudrate)
+{
+  TRS232_config serial_config;
+
+  this->comm_access.enter();
+  serial_config.baud=baudrate;
+  serial_config.num_bits=8;
+  serial_config.parity=none;
+  serial_config.stop_bits=1;
+  this->comm_dev->config(&serial_config);
+  this->bus_info.baud_rate=baudrate;
+  this->comm_access.exit();
+}
+
+std::string CDynamixelSlaveSerial::get_serial_device(void)
+{
+  return this->bus_info.device;
+}
+
+CDynamixelSlaveSerial::~CDynamixelSlaveSerial()
+{
+  this->stop();
+}
diff --git a/src/dynamixel_slave_serial.h b/src/dynamixel_slave_serial.h
new file mode 100644
index 0000000000000000000000000000000000000000..1976e4fc7f744c2ebb7609208b33f086e9a0b071
--- /dev/null
+++ b/src/dynamixel_slave_serial.h
@@ -0,0 +1,58 @@
+#ifndef _DYNAMIXEL_SLAVE_SERIAL_H
+#define _DYNAMIXEL_SLAVE_SERIAL_H
+
+#include "dynamixel_slave.h"
+
+/**
+ * \brief Basic Dynamixel bus information
+ *
+ * This structure holds the identifier of the current bus used (in case there
+ * exist multiple buses) and also the baudrate of the bus.  
+ */
+typedef struct
+{
+  int baud_rate;
+  std::string device;
+}TBus_info;
+
+/**
+ * \brief
+ *
+ */
+class CDynamixelSlaveSerial : public CDynamixelSlave
+{
+  private:
+    /**
+     * \brief 
+     *
+     */ 
+    TBus_info bus_info;
+  public:
+    /**
+     * \brief 
+     *
+     */ 
+    CDynamixelSlaveSerial(const std::string& cont_id,const std::string &device,dyn_version_t dyn_ver=dyn_version1);
+    /**
+     * \brief 
+     *
+     */ 
+    void set_baudrate(int baudrate);
+    /**
+     * \brief 
+     *
+     */ 
+    int get_baudrate(void);
+    /**
+     * \brief 
+     *
+     */
+    std::string get_serial_device(void);
+    /**
+     * \brief 
+     *
+     */ 
+    virtual ~CDynamixelSlaveSerial();
+};
+
+#endif
diff --git a/src/examples/test_dynamixel_slave.cpp b/src/examples/test_dynamixel_slave.cpp
index bf8d8d5aa0e7f62b861740f60f6156b95918ab48..4859730690a13c541fa1e4dcd7ab8ca5f9ab48dd 100644
--- a/src/examples/test_dynamixel_slave.cpp
+++ b/src/examples/test_dynamixel_slave.cpp
@@ -1,14 +1,14 @@
 #include "eventexceptions.h"
-#include "dynamixel_slave_ftdi.h"
+#include "dynamixel_slave_serial.h"
 #include <iostream>
 
 int main(int argc, char *argv[])
 {
-  CDynamixelSlaveFTDI slave("slave");
-
   try{
-    slave.config_bus(0,1000000);
+    CDynamixelSlaveSerial slave("slave","/dev/ttyUSB0");
+    slave.set_baudrate(921600);
     sleep(10);
+    std::cout << "exit" << std::endl;
   }catch(CException &e){
     std::cout << e.what() << std::endl;
   }