diff --git a/src/examples/test_segwayRMP400.cpp b/src/examples/test_segwayRMP400.cpp
index e2e662c02de134e9397874ccfe6ad66d463673b2..0a9959293008180f60a60092b0af4dbf8064a0e2 100644
--- a/src/examples/test_segwayRMP400.cpp
+++ b/src/examples/test_segwayRMP400.cpp
@@ -1,74 +1,59 @@
 #include "segway_RMP400.h"
 #include "segway_RMP400_exception.h"
+#include "eventexceptions.h"
 #include <iostream>
 
 using namespace std;
 
 int main(int argc, char *argv[])
-{ 
-  cout << "TEST SEGWAY RMP 400 DRIVER" << endl;
-  CSegwayRMP400 segway;
-
+{
+  CEventServer *event_server=CEventServer::instance();
+  std::list<std::string> events;
+  unsigned int i=0;
+  
   try
   {
+    cout << "TEST SEGWAY RMP 400 DRIVER" << endl;
+    CSegwayRMP400 segway;
     segway.connect("00000269","00000261");
     segway.reset_integrators();
     cout << "Platform started" << endl;
-  }
-  catch (CException & e)
-  {
-    cout<< e.what().c_str()<<endl;
-    return false;
-  }
-
-  char c;
-  do{
-    cout << "Do you want to move the robot? (y/n):" << endl;
-    cin >> c;
-  }while(c!='y' && c!='n');
-  if(c=='n')
-  {
-    cout << "Press any key+intro to close the program" << endl;
-    cin >> c;
-  }else if(c=='y')
-  {
-    cout << "CAUTION!! THIS PROGRAM MOVES THE SEGWAYRMP400" << endl;
-    cout << "You need at least 4x4 meter clearance around the robot for these tests!" << endl;
-    cout << "No obstacle avoidance is implemented. If there is something in the way the robot will hit it!" << endl;
-    cout << "Moving 0.5 meters at 0.05m/sec" << endl;
     sleep(1);
+    cout << "start moving forward" << endl;
+    events.push_back(segway.get_new_status_event_id());
     segway.move(0.05,0.0); // 5cm per second 10 seconds = half a meter
-    int i;
     //for(i=0;i<10;i++)
     for(;;)
     {
-      sleep(1);
-      cout << segway << endl;
+      try{
+        event_server->wait_first(events,1000);
+        cout << segway << endl;
+      }catch(CEventTimeoutException &e){
+        std::cout << "No status data received for over a second" << std::endl;
+      }
     }
     segway.stop();
     sleep(2);
-
     cout << "Rotating 360 degrees with center of rotation on the side of the base" << endl;
-    sleep(1);
     segway.move(0.0,0.1); // one 10th rev per second, 10 seconds = 360 degrees turn 
                            // center right on the side of the base (about 54 cm from center of base)
+    for(i=0;i<10;i++)
+    {
+      sleep(1);
+      cout << segway << endl;
+    }
     segway.stop();
     sleep(2);
-
-    cout << "Rotating 360 degrees with center of rotation 1m away from the base center" << endl;
-    sleep(1);
-    segway.move(0.1,0.1); // one 10th rev per second, 10 seconds = 360 degrees turn
-                           // center of rotation vT/vR = 1meter from the center of the base
-   // tensecs(segway);
-    segway.stop();
-    sleep(2);
-
     cout << "Rotating backwards 360 degrees with center of rotation 1m away from the base center" << endl;
-    sleep(1);
     segway.move(-0.1,0.1); // one 10th rev per second, 10 seconds = 360 degrees turn BACKWARDS
-                            // center of rotation vT/vR = 1meter from the center of the base
+    for(i=0;i<10;i++)
+    {
+      sleep(1);
+      cout << segway << endl;
+    }
+  }
+  catch (CException & e)
+  {
+    cout<< e.what().c_str()<<endl;
   }
-
-  segway.stop();
-  return 0;
 }
diff --git a/src/segway_RMP400.cpp b/src/segway_RMP400.cpp
index 89374f82b7175b4bc156c895f590d8736cc6cc5f..027bb49e7f7a9710c5dd072d04355a026097416a 100644
--- a/src/segway_RMP400.cpp
+++ b/src/segway_RMP400.cpp
@@ -9,6 +9,7 @@ CSegwayRMP400::CSegwayRMP400() :
   yaw_rate(0.0)
 {
   this->connected=false;
+  this->segways.resize(NUM_SEGWAY_200);
 }
 
 CSegwayRMP400::CSegwayRMP400(const std::string &front, const std::string &rear) :
@@ -17,12 +18,60 @@ CSegwayRMP400::CSegwayRMP400(const std::string &front, const std::string &rear)
   yaw_rate(0.0)
 {
   this->connected=false;
+  this->segways.resize(NUM_SEGWAY_200);
   this->connect(front,rear);
 }
 
 void *CSegwayRMP400::monitor_thread(void *param)
 {
   CSegwayRMP400 *segway=(CSegwayRMP400 *)param;
+  std::vector<bool> status_received(false,NUM_SEGWAY_200);
+  double fwd_displ_front,fwd_displ_rear; 
+  std::list<std::string> events;
+  int event_id=0;
+  bool end=false;
+
+  events.push_back(segway->finish_thread_event_id);
+  events.push_back(segway->segways[front_segway].get_new_status_event());
+  events.push_back(segway->segways[rear_segway].get_new_status_event());
+  while(!end)
+  {
+    event_id=segway->event_server->wait_first(events);
+    segway->status_access.enter();
+    try{
+      if(event_id==0)
+        end=true;
+      else if(event_id==1)// front status
+      {
+        status_received[front_segway]=true;
+        segway->status.rmp200[front_segway]=segway->segways[front_segway].get_status();
+      }
+      else if(event_id==2)// rear status
+      {
+        status_received[rear_segway]=true;
+        segway->status.rmp200[rear_segway]=segway->segways[rear_segway].get_status();
+      }
+      if(status_received[front_segway] && status_received[rear_segway])
+      {
+        /* compute the forward displacement  */
+        fwd_displ_front=(segway->segways[front_segway].get_right_wheel_displacement()+segway->segways[front_segway].get_left_wheel_displacement())/2;
+        fwd_displ_rear=(segway->segways[rear_segway].get_right_wheel_displacement()+segway->segways[rear_segway].get_left_wheel_displacement())/2;
+        segway->forward_displacement=(fwd_displ_front+fwd_displ_rear)/2;
+        /* compute yaw displacement*/
+        segway->yaw_displacement=(segway->segways[front_segway].get_yaw_displacement()+segway->segways[rear_segway].get_yaw_displacement())/2;
+        /* compute yaw rate */
+        segway->yaw_rate=(segway->segways[front_segway].get_yaw_rate()+segway->segways[rear_segway].get_yaw_rate())/2;
+        /* activate event */
+        if(!segway->event_server->event_is_set(segway->new_status_event_id))
+          segway->event_server->set_event(segway->new_status_event_id);
+        status_received[front_segway]=false;
+        status_received[rear_segway]=false;
+      }
+    }catch(CException &e){
+      std::cout << e.what() << std::endl;
+    }
+    segway->status_access.exit();
+  }
 
   pthread_exit(NULL);
 }
@@ -136,25 +185,31 @@ std::ostream & operator<< (std::ostream& data, CSegwayRMP400 & segway)
 
 TSegwayRMP400Status CSegwayRMP400::get_status()
 {
-  return this->status;
+  TSegwayRMP400Status status_tmp;
+
+  if(this->connected)
+  {
+    this->status_access.enter();
+    status_tmp=this->status;
+    this->status_access.exit();
+
+    return status_tmp;
+  }
+  else
+    throw CSegwayRMP400Exception(_HERE_,"The driver is not connected","");
 }
 
 double CSegwayRMP400::get_forward_displacement()
 {
-  double fwd_displ_front,fwd_displ_rear; 
-
-  // The get_forward_displacement function in segway RMP 200 doesn't
-  // return the accumulate value of displacement, wheel_displacement
-  // function do. Use them instead.
+  double fwd_disp;
 
   if(this->connected)
   {
-    fwd_displ_front=(this->segways[front_segway].get_right_wheel_displacement()+this->segways[front_segway].get_left_wheel_displacement())/2;
-    fwd_displ_rear=(this->segways[rear_segway].get_right_wheel_displacement()+this->segways[rear_segway].get_left_wheel_displacement())/2;
-
-    this->forward_displacement=(fwd_displ_front+fwd_displ_rear)/2;
+    this->status_access.enter();
+    fwd_disp=this->forward_displacement;
+    this->status_access.exit();
 
-    return this->forward_displacement;
+    return fwd_disp;
   }
   else
     throw CSegwayRMP400Exception(_HERE_,"The driver is not connected","");
@@ -162,11 +217,15 @@ double CSegwayRMP400::get_forward_displacement()
 
 double CSegwayRMP400::get_yaw_displacement()
 {
+  double yaw_disp;
+
   if(this->connected)
   {
-    this->yaw_displacement=(this->segways[front_segway].get_yaw_displacement()+this->segways[rear_segway].get_yaw_displacement())/2;
+    this->status_access.enter();
+    yaw_disp=this->yaw_displacement;
+    this->status_access.exit();
 
-    return this->yaw_displacement;
+    return yaw_disp;
   }
   else
     throw CSegwayRMP400Exception(_HERE_,"The driver is not connected","");
@@ -174,11 +233,15 @@ double CSegwayRMP400::get_yaw_displacement()
 
 double CSegwayRMP400::get_yaw_rate()
 {
+  double yaw_rate_tmp;
+
   if(this->connected)
   {
-    this->yaw_rate=(this->segways[front_segway].get_yaw_rate()+this->segways[rear_segway].get_yaw_rate())/2;
+    this->status_access.enter();
+    yaw_rate_tmp=this->yaw_rate;
+    this->status_access.exit();
 
-    return this->yaw_rate;
+    return yaw_rate_tmp;
   }
   else
     throw CSegwayRMP400Exception(_HERE_,"The driver is not connected","");