diff --git a/Findbno055_imu_sim.cmake b/Findbno055_imu_sim.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..d535c23e11c081b8d798698db82b51dee5f9e9d0
--- /dev/null
+++ b/Findbno055_imu_sim.cmake
@@ -0,0 +1,21 @@
+#edit the following line to add the librarie's header files
+FIND_PATH(bno055_imu_sim_INCLUDE_DIR bno055_imu_sim.h /usr/include/iridrivers /usr/local/include/iridrivers)
+
+FIND_LIBRARY(bno055_imu_sim_LIBRARY
+    NAMES bno055_imu_sim
+    PATHS /usr/lib /usr/local/lib /usr/local/lib/iridrivers) 
+
+IF (bno055_imu_sim_INCLUDE_DIR AND bno055_imu_sim_LIBRARY)
+   SET(bno055_imu_sim_FOUND TRUE)
+ENDIF (bno055_imu_sim_INCLUDE_DIR AND bno055_imu_sim_LIBRARY)
+
+IF (bno055_imu_sim_FOUND)
+   IF (NOT bno055_imu_sim_FIND_QUIETLY)
+      MESSAGE(STATUS "Found bno055_imu_sim: ${bno055_imu_sim_LIBRARY}")
+   ENDIF (NOT bno055_imu_sim_FIND_QUIETLY)
+ELSE (bno055_imu_sim_FOUND)
+   IF (bno055_imu_sim_FIND_REQUIRED)
+      MESSAGE(FATAL_ERROR "Could not find bno055_imu_sim")
+   ENDIF (bno055_imu_sim_FIND_REQUIRED)
+ENDIF (bno055_imu_sim_FOUND)
+
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 3f9444e484052ee94b4ca863d630caa895c6aa6c..b7b96683553aa06999ff893d498c587e14bd3ad5 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,7 +1,11 @@
 # driver source files
 SET(sources bno055_imu_driver.cpp bno055_imu_exceptions.cpp)
 # application header files
-SET(headers bno055_imu_driver.h bno055_imu_exceptions.h)
+SET(headers bno055_imu_driver.h bno055_imu_exceptions.h bno055_common.h)
+# simulator source files
+SET(sources_sim bno055_imu_sim.cpp bno055_imu_exceptions.cpp)
+# application header files
+SET(headers_sim bno055_imu_sim.h bno055_imu_exceptions.h bno055_common.h)
 # locate the necessary dependencies
 FIND_PACKAGE(iriutils REQUIRED)
 FIND_PACKAGE(comm REQUIRED)
@@ -15,10 +19,23 @@ ADD_LIBRARY(bno055_imu_driver SHARED ${sources})
 TARGET_LINK_LIBRARIES(bno055_imu_driver ${iriutils_LIBRARY})
 TARGET_LINK_LIBRARIES(bno055_imu_driver ${comm_LIBRARY})
 
+# create the shared library
+ADD_LIBRARY(bno055_imu_sim SHARED ${sources_sim})
+# link necessary libraries
+TARGET_LINK_LIBRARIES(bno055_imu_sim ${iriutils_LIBRARY})
+TARGET_LINK_LIBRARIES(bno055_imu_sim ${comm_LIBRARY})
+
 INSTALL(TARGETS bno055_imu_driver
         RUNTIME DESTINATION bin
         LIBRARY DESTINATION lib/iridrivers
         ARCHIVE DESTINATION lib/iridrivers)
 INSTALL(FILES ${headers} DESTINATION include/iridrivers)
+INSTALL(TARGETS bno055_imu_sim
+        RUNTIME DESTINATION bin
+        LIBRARY DESTINATION lib/iridrivers
+        ARCHIVE DESTINATION lib/iridrivers)
+INSTALL(FILES ${headers_sim} DESTINATION include/iridrivers)
 INSTALL(FILES ../Findbno055_imu_driver.cmake DESTINATION ${CMAKE_ROOT}/Modules/)
+INSTALL(FILES ../Findbno055_imu_sim.cmake DESTINATION ${CMAKE_ROOT}/Modules/)
+
 ADD_SUBDIRECTORY(examples)
diff --git a/src/bno055_common.h b/src/bno055_common.h
new file mode 100644
index 0000000000000000000000000000000000000000..762e91bc6502ecf0f3826e8ded22038b53a44fa9
--- /dev/null
+++ b/src/bno055_common.h
@@ -0,0 +1,148 @@
+#ifndef BNO055_COMMON_H
+#define BNO055_COMMON_H
+
+typedef enum {normal_mode=0x00,
+              low_power_mode=0x01,
+              suspend_mode=0x02} power_mode_t;
+
+typedef enum {config_mode=0x00,
+              acc_only_mode=0x01,
+              mag_only_mode=0x02,
+              gyro_only_mode=0x03,
+              acc_mag_mode=0x04,
+              acc_gyro_mode=0x05,
+              mag_gyro_mode=0x06,
+              acc_mag_gyro_mode=0x07,
+              imu_mode=0x08,
+              compass_mode=0x09,
+              m4g_mode=0x0A,
+              ndof_off_mode=0x0B,
+              ndof_mode=0x0C} op_mode_t;
+
+typedef struct
+{
+  unsigned char chip_id;
+  unsigned char acc_id;
+  unsigned char mag_id;
+  unsigned char gyr_id;
+  unsigned short int soft_ver;
+  unsigned char boot_ver;
+}TBNO055IMUInfo;
+
+/* accelerometer definitions */
+/* operation mode */
+#define       ACCEL_MODE_MASK               0xE0
+#define       ACCEL_NORMAL_MODE            0x00
+#define       ACCEL_SUSPEND_MODE           0x20
+#define       ACCEL_LOW_POWER1_MODE        0x40
+#define       ACCEL_STANDBY_MODE           0x60
+#define       ACCEL_LOW_POWER2_MODE        0x80
+#define       ACCEL_DEEP_SUSPEND_MODE      0xA0
+
+/* range */
+#define       ACCEL_RANGE_MASK             0x03
+#define       ACCEL_2G_RANGE               0x00
+#define       ACCEL_4G_RANGE               0x01
+#define       ACCEL_8G_RANGE               0x02
+#define       ACCEL_16G_RANGE              0x03
+
+/* bandwidth */
+#define       ACCEL_BW_MASK                0x1C
+#define       ACCEL_7_81_BW                0x00
+#define       ACCEL_15_63_BW               0x04
+#define       ACCEL_31_25_BW               0x08
+#define       ACCEL_62_5_BW                0x0C
+#define       ACCEL_125_BW                 0x10
+#define       ACCEL_250_BW                 0x14
+#define       ACCEL_500_BW                 0x18
+#define       ACCEL_1000_BW                0x1C
+
+typedef enum {accel_linear,accel_gravity} accel_units_t;
+
+typedef struct
+{
+  unsigned char conf_reg;
+  accel_units_t units;
+}TBNO055AccelConfig;
+
+/* gyroscope definitions */
+/* operation mode */
+#define       GYRO_MODE_MASK               0x07
+#define       GYRO_NORMAL_MODE             0x00
+#define       GYRO_FAST_PWR_UP_MODE        0x01
+#define       GYRO_DEEP_SUSPEND_MODE       0x02
+#define       GYRO_SUSPEND_MODE            0x03
+#define       GYRO_ADV_POWER_SAVE_MODE     0x04
+
+/* range */
+#define       GYRO_RANGE_MASK              0x07
+#define       GYRO_2000_RANGE              0x00
+#define       GYRO_1000_RANGE              0x01
+#define       GYRO_500_RANGE               0x02
+#define       GYRO_250_RANGE               0x03
+#define       GYRO_125_RANGE               0x04
+
+/* bandwidth */
+#define       GYRO_BW_MASK                 0x38
+#define       GYRO_523_BW                  0x00
+#define       GYRO_230_BW                  0x08
+#define       GYRO_116_BW                  0x10
+#define       GYRO_47_BW                   0x18
+#define       GYRO_23_BW                   0x20
+#define       GYRO_12_BW                   0x28
+#define       GYRO_64_BW                   0x30
+#define       GYRO_32_BW                   0x38
+
+typedef enum {gyro_deg,gyro_rad} gyro_units_t;
+typedef enum {euler_deg,euler_rad} euler_units_t;
+
+typedef struct
+{
+  unsigned char conf_reg1;
+  unsigned char conf_reg2;
+  gyro_units_t units;
+}TBNO055GyroConfig;
+
+/* magnetometer definitions */
+/* operation mode */
+#define       MAG_OP_MODE_MASK             0x18
+#define       MAG_LOW_POWER_MODE           0x00
+#define       MAG_REGULAR_MODE             0x08
+#define       MAG_EN_REGULAR_MODE          0x10
+#define       MAG_HICH_ACC_MODE            0x18
+
+/* power mode */
+#define       MAG_POWER_MODE_MASK          0x60
+#define       MAG_NORMAL_MODE              0x00
+#define       MAG_SLEEP_MODE               0x20
+#define       MAG_SUSPEND_MODE             0x40
+#define       MAG_FORCE_MODE               0x60
+
+/* rate */
+#define       MAG_RATE_MASK                0x07
+#define       MAG_2_RATE                   0x00
+#define       MAG_6_RATE                   0x01
+#define       MAG_8_RATE                   0x02
+#define       MAG_10_RATE                  0x03
+#define       MAG_15_RATE                  0x04
+#define       MAG_20_RATE                  0x05
+#define       MAG_25_RATE                  0x06
+#define       MAG_30_RATE                  0x07
+
+typedef struct
+{
+  unsigned char conf_reg;
+}TBNO055MagConfig;
+
+#define       ACCEL_UNITS_MASK             0x01
+#define       GYRO_UNITS_MASK              0x02
+#define       EULER_UNITS_MASK             0x04
+#define       TEMP_UNITS_MASK              0x10
+
+/* temperature definitions */
+typedef enum {temp_celcius,temp_farenheit} temp_units_t;
+
+/* axis remapping definitions */
+typedef enum {X_AXIS=0x00,Y_AXIS=0x01,Z_AXIS=0x02} axis_t;
+
+#endif
diff --git a/src/bno055_imu_driver.h b/src/bno055_imu_driver.h
index 3b81feaaed596e8a63e075076b9ceb4e588b4b31..2ddb42401e89e1734b818bbc00eb301ec56f3edf 100644
--- a/src/bno055_imu_driver.h
+++ b/src/bno055_imu_driver.h
@@ -4,152 +4,9 @@
 #include "rs232.h"
 #include "mutex.h"
 #include "threadserver.h"
+#include "bno055_common.h"
 #include <vector>
 
-typedef enum {normal_mode=0x00,
-              low_power_mode=0x01,
-              suspend_mode=0x02} power_mode_t;
-
-typedef enum {config_mode=0x00,
-              acc_only_mode=0x01,
-              mag_only_mode=0x02,
-              gyro_only_mode=0x03,
-              acc_mag_mode=0x04,
-              acc_gyro_mode=0x05,
-              mag_gyro_mode=0x06,
-              acc_mag_gyro_mode=0x07,
-              imu_mode=0x08,
-              compass_mode=0x09,
-              m4g_mode=0x0A,
-              ndof_off_mode=0x0B,
-              ndof_mode=0x0C} op_mode_t;
-
-typedef struct
-{
-  unsigned char chip_id;
-  unsigned char acc_id;
-  unsigned char mag_id;
-  unsigned char gyr_id;
-  unsigned short int soft_ver;
-  unsigned char boot_ver;
-}TBNO055IMUInfo;
-
-/* accelerometer definitions */
-/* operation mode */
-#define       ACCEL_MODE_MASK               0xE0
-#define       ACCEL_NORMAL_MODE            0x00
-#define       ACCEL_SUSPEND_MODE           0x20
-#define       ACCEL_LOW_POWER1_MODE        0x40
-#define       ACCEL_STANDBY_MODE           0x60
-#define       ACCEL_LOW_POWER2_MODE        0x80
-#define       ACCEL_DEEP_SUSPEND_MODE      0xA0
-
-/* range */
-#define       ACCEL_RANGE_MASK             0x03
-#define       ACCEL_2G_RANGE               0x00
-#define       ACCEL_4G_RANGE               0x01
-#define       ACCEL_8G_RANGE               0x02
-#define       ACCEL_16G_RANGE              0x03
-
-/* bandwidth */
-#define       ACCEL_BW_MASK                0x1C
-#define       ACCEL_7_81_BW                0x00
-#define       ACCEL_15_63_BW               0x04
-#define       ACCEL_31_25_BW               0x08
-#define       ACCEL_62_5_BW                0x0C
-#define       ACCEL_125_BW                 0x10
-#define       ACCEL_250_BW                 0x14
-#define       ACCEL_500_BW                 0x18
-#define       ACCEL_1000_BW                0x1C
-
-typedef enum {accel_linear,accel_gravity} accel_units_t;
-
-typedef struct
-{
-  unsigned char conf_reg;
-  accel_units_t units;
-}TBNO055AccelConfig;
-
-/* gyroscope definitions */
-/* operation mode */
-#define       GYRO_MODE_MASK               0x07
-#define       GYRO_NORMAL_MODE             0x00
-#define       GYRO_FAST_PWR_UP_MODE        0x01
-#define       GYRO_DEEP_SUSPEND_MODE       0x02
-#define       GYRO_SUSPEND_MODE            0x03
-#define       GYRO_ADV_POWER_SAVE_MODE     0x04
-
-/* range */
-#define       GYRO_RANGE_MASK              0x07
-#define       GYRO_2000_RANGE              0x00
-#define       GYRO_1000_RANGE              0x01
-#define       GYRO_500_RANGE               0x02
-#define       GYRO_250_RANGE               0x03
-#define       GYRO_125_RANGE               0x04
-
-/* bandwidth */
-#define       GYRO_BW_MASK                 0x38
-#define       GYRO_523_BW                  0x00
-#define       GYRO_230_BW                  0x08
-#define       GYRO_116_BW                  0x10
-#define       GYRO_47_BW                   0x18
-#define       GYRO_23_BW                   0x20
-#define       GYRO_12_BW                   0x28
-#define       GYRO_64_BW                   0x30
-#define       GYRO_32_BW                   0x38
-
-typedef enum {gyro_deg,gyro_rad} gyro_units_t;
-typedef enum {euler_deg,euler_rad} euler_units_t;
-
-typedef struct
-{
-  unsigned char conf_reg1;
-  unsigned char conf_reg2;
-  gyro_units_t units;
-}TBNO055GyroConfig;
-
-/* magnetometer definitions */
-/* operation mode */
-#define       MAG_OP_MODE_MASK             0x18
-#define       MAG_LOW_POWER_MODE           0x00
-#define       MAG_REGULAR_MODE             0x08
-#define       MAG_EN_REGULAR_MODE          0x10
-#define       MAG_HICH_ACC_MODE            0x18
-
-/* power mode */
-#define       MAG_POWER_MODE_MASK          0x60
-#define       MAG_NORMAL_MODE              0x00
-#define       MAG_SLEEP_MODE               0x20
-#define       MAG_SUSPEND_MODE             0x40
-#define       MAG_FORCE_MODE               0x60
-
-/* rate */
-#define       MAG_RATE_MASK                0x07
-#define       MAG_2_RATE                   0x00
-#define       MAG_6_RATE                   0x01
-#define       MAG_8_RATE                   0x02
-#define       MAG_10_RATE                  0x03
-#define       MAG_15_RATE                  0x04
-#define       MAG_20_RATE                  0x05
-#define       MAG_25_RATE                  0x06
-#define       MAG_30_RATE                  0x07
-
-typedef struct
-{
-  unsigned char conf_reg;
-}TBNO055MagConfig;
-
-#define       ACCEL_UNITS_MASK             0x01
-#define       GYRO_UNITS_MASK              0x02
-#define       EULER_UNITS_MASK             0x04
-#define       TEMP_UNITS_MASK              0x10
-
-/* temperature definitions */
-typedef enum {temp_celcius,temp_farenheit} temp_units_t;
-
-/* axis remapping definitions */
-typedef enum {X_AXIS=0x00,Y_AXIS=0x01,Z_AXIS=0x02} axis_t;
-
 class CBNO055IMUDriver
 {
   private:
diff --git a/src/bno055_imu_sim.cpp b/src/bno055_imu_sim.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d4d0291f9ed77c8c1aee65162985da19c204a45d
--- /dev/null
+++ b/src/bno055_imu_sim.cpp
@@ -0,0 +1,370 @@
+#include "bno055_imu_sim.h"
+#include "bno055_imu_exceptions.h"
+#include "eventexceptions.h"
+#include <iostream>
+#include <fstream>
+#include <math.h>
+
+unsigned char page0_data[]={0xA0,0xFB,0x32,0x0F,// chip ID's
+                            0x08,0x03,0x00,// version ID's
+                            0x00,//page 0 ID
+                            0x00,0x00,0x00,0x00,0x00,0x00,// acceleration data
+                            0x00,0x00,0x00,0x00,0x00,0x00,// magnetometer data
+                            0x00,0x00,0x00,0x00,0x00,0x00,// gyroscope data
+                            0x00,0x00,0x00,0x00,0x00,0x00,// euler data
+                            0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// quaternion data
+                            0x00,0x00,0x00,0x00,0x00,0x00,// linear acceleration data
+                            0x00,0x00,0x00,0x00,0x00,0x00,// gravity data
+                            0x00, // temperature
+                            0x00, // calibration status
+                            0x0F, // ST result
+                            0x00, // interrupt status
+                            0x00, // clock status
+                            0x00, // system status
+                            0x00, // system error code
+                            0x80, // units
+                            0xFF, // reserved
+                            0x1C, // operation mode
+                            0x00, // power mode
+                            0x00, // system trigger
+                            0x02, // temperature source
+                            0x00, // axis map config
+                            0x00, // axis map sign
+                            0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+                            0x00,0x00,0x00,0x00,0x00,0x00,// acceleration offset
+                            0x00,0x00,0x00,0x00,0x00,0x00,// magnetometer offset
+                            0x00,0x00,0x00,0x00,0x00,0x00,// gyroscope offset
+                            0x00,0x00,// accelerometer radius
+                            0x00,0x00};// magnetometer radius
+
+unsigned char page1_data[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00, //reserved
+                            0x01, // page ID
+                            0x0D, // accelerometer config
+                            0x6D, // magnetometer config
+                            0x38,0x00, // gyroscope config
+                            0x00, // accelerometer sleep config
+                            0x00, // gyroscope sleep config
+                            0x00, // reserved
+                            0x00, // interrupt mask
+                            0x00, // interrupt enable
+                            0x14, // accelerometer any motion threshold
+                            0x03, // accelerometer interrupt settings
+                            0x0F, // accelerometer High G duration 
+                            0xC0, // accelerometer High G threshold
+                            0x0A, // accelerometer no/slow motion threshold 
+                            0x0B, // accelerometer no/slow motion duration
+                            0x00, // gyroscope interrupt settings
+                            0x01, // gyroscope high rate thresold X
+                            0x19, // gyroscope high rate duration X
+                            0x01, // gyroscope high rate thresold Y
+                            0x19, // gyroscope high rate duration Y
+                            0x01, // gyroscope high rate thresold Z
+                            0x19, // gyroscope high rate duration Z
+                            0x04, // gyroscope any motion threshold
+                            0x0A, // gyroscope awake duration
+                            0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+                            0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+                            0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+                            0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F};// BNO unique ID
+
+typedef enum {imu_header,imu_cmd,imu_address,imu_length,imu_data} receive_states_t;
+
+CBNO055IMUSim::CBNO055IMUSim(const std::string &name,const std::string &serial_dev)
+{
+  TRS232_config config;
+
+  if(name.size()==0)
+    throw CBNO055IMUException(_HERE_,"Invalid IMU name");
+  else
+  {
+    this->imu_name=name;
+    this->imu_port=NULL;
+    this->imu_device.clear();
+    this->power_mode=normal_mode;
+    this->op_mode=config_mode;
+    this->current_page=0x00;
+    try{
+      this->imu_port=new CRS232(this->imu_name+"_serial_port");
+      this->imu_port->open((void *)&serial_dev);
+      config.baud=115200;
+      config.num_bits=8;
+      config.parity=none;
+      config.stop_bits=1;
+      this->imu_port->config(&config);
+    }catch(CException &s){
+      if(this->imu_port!=NULL)
+      {
+        this->imu_port->close();
+        delete this->imu_port;
+        this->imu_port=NULL;
+      }
+      throw;
+    }
+    /* initialize events */
+    this->event_server=CEventServer::instance();
+    this->finish_thread_event_id=this->imu_name+"_finish_thread_event";
+    this->event_server->create_event(this->finish_thread_event_id);
+    /* initialize threads */
+    this->thread_server=CThreadServer::instance();
+    this->data_thread_id=this->imu_name+"_data_thread";
+    this->thread_server->create_thread(this->data_thread_id);
+    this->thread_server->attach_thread(this->data_thread_id,this->data_thread,this);
+    this->thread_server->start_thread(this->data_thread_id);
+  }
+}
+
+void *CBNO055IMUSim::data_thread(void *param)
+{
+  CBNO055IMUSim *imu=(CBNO055IMUSim *)param;
+  receive_states_t state=imu_header;
+  unsigned char address,length,op,*data,*serial_data,*cmd;
+  std::list<std::string> events;
+  unsigned int index,num,num_read=0,i,j;
+  bool end=false;
+
+  events.push_back(imu->finish_thread_event_id);
+  events.push_back(imu->imu_port->get_rx_event_id());
+
+  while(!end)
+  {
+    index=imu->event_server->wait_first(events);
+    if(index==0)
+      end=true;
+    else if(index==1)
+    {
+      imu->data_access.enter();
+      num=imu->imu_port->get_num_data();
+      serial_data=new unsigned char[num];
+      imu->imu_port->read(serial_data,num);
+      for(i=0;i<num;i++)
+      {
+        switch(state)
+        {
+          case imu_header: if(serial_data[i]==0xAA)
+                             state=imu_cmd;
+                           else
+                             state=imu_header;
+                           break;
+          case imu_cmd: state=imu_address;
+                        op=serial_data[i];
+                        break;
+          case imu_address: state=imu_length;
+                            address=serial_data[i];
+                            break;
+          case imu_length: length=serial_data[i]; 
+                           if(op==0x00)
+                           {
+                             state=imu_data;
+                             data=new unsigned char[length];
+                             num_read=0;
+                           }
+                           else
+                           {
+                             state= imu_header;
+                             // send the desired data
+                             cmd=new unsigned char[2+length];
+                             cmd[0]=0xBB;
+                             cmd[1]=length; 
+                             for(j=0;j<length;j++)
+                             {
+                               if(imu->current_page==0x00)
+                                 cmd[2+j]=page0_data[address+j];
+                               else
+                                 cmd[2+j]=page1_data[address+j];
+                             }
+                             imu->imu_port->write(cmd,2+length);
+                             delete[] cmd;
+                           }
+                           break;
+          case imu_data: data[num_read]=serial_data[i];
+                         num_read++;
+                         if(num_read==length)
+                         {
+                           // process the write command
+                           // send the response
+                           cmd=new unsigned char[2];
+                           cmd[0]=0xBB;
+                           cmd[1]=0x01;
+                           imu->imu_port->write(cmd,2);
+                           delete[] cmd;
+                           delete[] data;
+                           state=imu_header;
+                         }                         
+                         else
+                           state=imu_data;
+                         break;
+        }
+      }
+      delete[] serial_data;
+      imu->data_access.exit();
+    }
+  }
+
+  pthread_exit(NULL);
+}
+
+void CBNO055IMUSim::process_write(unsigned char address, unsigned char length, unsigned char *data)
+{
+  unsigned int i=0;
+
+  for(i=address;i<address+length;i++)
+  {
+    if(this->current_page==0x00)
+    {
+      page0_data[i]=data[i-address];
+      switch(i)
+      {
+        case 0x07: this->current_page=data[i-address];
+                   break;
+        case 0x3B: if(data[i-address]&0x01)
+                     this->accel_config.units=accel_gravity;
+                   else
+                     this->accel_config.units=accel_linear;
+                   if(data[i-address]&0x02)
+                     this->gyro_config.units=gyro_rad;
+                   else
+                     this->gyro_config.units=gyro_deg;
+                   if(data[i-address]&0x04)
+                     this->euler_units=euler_rad;
+                   else
+                     this->euler_units=euler_deg;
+                   if(data[i-address]&0x10)
+                     this->temp_units=temp_farenheit;
+                   else
+                     this->temp_units=temp_celcius;
+                   break;
+      }
+    }
+    else
+    {
+      switch(i)
+      {
+        case 0x07: this->current_page=data[i-address];
+                   break;
+      }
+    }
+  }
+}
+
+void CBNO055IMUSim::set_calibrated(void)
+{
+  page0_data[53]=0xFF;
+}
+
+void CBNO055IMUSim::set_accel_data(double x, double y, double z)
+{
+  page0_data[8]=((int)(x*100.0))%256;
+  page0_data[9]=((int)(x*100.0))/256;
+  page0_data[10]=((int)(y*100.0))%256;
+  page0_data[11]=((int)(y*100.0))/256;
+  page0_data[12]=((int)(z*100.0))%256;
+  page0_data[13]=((int)(z*100.0))/256;
+}
+
+void CBNO055IMUSim::set_gyro_data(double x, double y, double z)
+{
+  if(this->gyro_config.units==gyro_deg)
+  {
+    page0_data[20]=((int)(x*16.0))%256;
+    page0_data[21]=((int)(x*16.0))/256;
+    page0_data[22]=((int)(y*16.0))%256;
+    page0_data[23]=((int)(y*16.0))/256;
+    page0_data[24]=((int)(z*16.0))%256;
+    page0_data[25]=((int)(z*16.0))/256;
+  }
+  else
+  {
+    page0_data[20]=((int)(x*900.0))%256;
+    page0_data[21]=((int)(x*900.0))/256;
+    page0_data[22]=((int)(y*900.0))%256;
+    page0_data[23]=((int)(y*900.0))/256;
+    page0_data[24]=((int)(z*900.0))%256;
+    page0_data[25]=((int)(z*900.0))/256;
+  }
+}
+
+void CBNO055IMUSim::set_mag_data(double x, double y, double z)
+{
+  page0_data[14]=((int)(x*16.0))%256;
+  page0_data[15]=((int)(x*16.0))/256;
+  page0_data[16]=((int)(y*16.0))%256;
+  page0_data[17]=((int)(y*16.0))/256;
+  page0_data[18]=((int)(z*16.0))%256;
+  page0_data[19]=((int)(z*16.0))/256;
+}
+
+void CBNO055IMUSim::set_quaternion_data(double x, double y, double z,double w)
+{
+  page0_data[32]=((int)(w*16384.0))%256;
+  page0_data[33]=((int)(w*16384.0))/256;
+  page0_data[34]=((int)(x*16384.0))%256;
+  page0_data[35]=((int)(x*16384.0))/256;
+  page0_data[36]=((int)(y*16384.0))%256;
+  page0_data[37]=((int)(y*16384.0))/256;
+  page0_data[38]=((int)(z*16384.0))%256;
+  page0_data[39]=((int)(z*16384.0))/256;
+}
+
+void CBNO055IMUSim::set_euler_angles_data(double yaw, double roll, double pitch)
+{
+  if(this->euler_units==euler_deg)
+  {
+    page0_data[26]=((int)(yaw*16.0))%256;
+    page0_data[27]=((int)(yaw*16.0))/256;
+    page0_data[28]=((int)(roll*16.0))%256;
+    page0_data[29]=((int)(roll*16.0))/256;
+    page0_data[30]=((int)(pitch*16.0))%256;
+    page0_data[31]=((int)(pitch*16.0))/256;
+  }
+  else
+  {
+    page0_data[26]=((int)(yaw*900.0))%256;
+    page0_data[27]=((int)(yaw*900.0))/256;
+    page0_data[28]=((int)(roll*900.0))%256;
+    page0_data[29]=((int)(roll*900.0))/256;
+    page0_data[30]=((int)(pitch*900.0))%256;
+    page0_data[31]=((int)(pitch*900.0))/256;
+  }
+}
+
+void CBNO055IMUSim::set_linear_accel_data(double x, double y, double z)
+{
+  page0_data[40]=((int)(x*100.0))%256;
+  page0_data[41]=((int)(x*100.0))/256;
+  page0_data[42]=((int)(y*100.0))%256;
+  page0_data[43]=((int)(y*100.0))/256;
+  page0_data[44]=((int)(z*100.0))%256;
+  page0_data[45]=((int)(z*100.0))/256;
+}
+
+void CBNO055IMUSim::set_gravity_data(double x, double y, double z)
+{
+  page0_data[46]=((int)(x*100.0))%256;
+  page0_data[47]=((int)(x*100.0))/256;
+  page0_data[48]=((int)(y*100.0))%256;
+  page0_data[49]=((int)(y*100.0))/256;
+  page0_data[50]=((int)(z*100.0))%256;
+  page0_data[51]=((int)(z*100.0))/256;
+}
+
+CBNO055IMUSim::~CBNO055IMUSim()
+{
+  if(this->thread_server->get_thread_state(this->data_thread_id)==starting ||
+     this->thread_server->get_thread_state(this->data_thread_id)==active)
+  {
+    this->event_server->set_event(this->finish_thread_event_id);
+    this->thread_server->end_thread(this->data_thread_id);
+  }
+  this->thread_server->detach_thread(this->data_thread_id);
+  this->thread_server->delete_thread(this->data_thread_id);
+  this->data_thread_id="";
+  this->event_server->delete_event(this->finish_thread_event_id);
+  this->finish_thread_event_id="";
+  if(this->imu_port!=NULL)
+  {
+    this->imu_port->close();
+    delete this->imu_port;
+    this->imu_port=NULL;
+  }
+}
+
diff --git a/src/bno055_imu_sim.h b/src/bno055_imu_sim.h
new file mode 100644
index 0000000000000000000000000000000000000000..0628c3265c87957a524b5f4e9b021b2aa7416219
--- /dev/null
+++ b/src/bno055_imu_sim.h
@@ -0,0 +1,54 @@
+#ifndef _BNO055_IMU_SIM_H
+#define _BNO055_IMU_SIM_H
+
+#include "rs232.h"
+#include "mutex.h"
+#include "threadserver.h"
+#include "bno055_common.h"
+#include <vector>
+
+class CBNO055IMUSim
+{
+  private:
+    std::string imu_name;
+    CRS232 *imu_port;
+    std::string imu_device;
+    CMutex imu_access;
+    power_mode_t power_mode;
+    op_mode_t op_mode;
+    unsigned char current_page;
+    /* thread attributes */
+    CThreadServer *thread_server;
+    std::string data_thread_id;
+    /* event attributes */
+    CEventServer *event_server;
+    std::string finish_thread_event_id;
+    /* sensor data */
+    CMutex data_access;
+    /* accelerometer data */
+    TBNO055AccelConfig accel_config;
+    /* magnetometer data */
+    TBNO055MagConfig mag_config;
+    /* gyroscope data */
+    TBNO055GyroConfig gyro_config;
+    /* temperature data */
+    temp_units_t temp_units;
+    /* fusion data */
+    euler_units_t euler_units;
+  protected:
+    static void *data_thread(void *param);
+    void process_write(unsigned char address, unsigned char length, unsigned char *data);
+  public:
+    CBNO055IMUSim(const std::string &name,const std::string &serial_dev);
+    void set_calibrated(void);
+    void set_accel_data(double x, double y, double z);
+    void set_gyro_data(double x, double y, double z);
+    void set_mag_data(double x, double y, double z);
+    void set_quaternion_data(double x, double y, double z,double w);
+    void set_euler_angles_data(double yaw, double roll, double pitch);
+    void set_linear_accel_data(double x, double y, double z);
+    void set_gravity_data(double x, double y, double z);
+    ~CBNO055IMUSim();
+};
+
+#endif
diff --git a/src/examples/CMakeLists.txt b/src/examples/CMakeLists.txt
index fd72ae5a9b0a36a24c83a0ca340577a11a071117..586bfd62897e2bfbc341b5ce3d6b2b20c68da8e1 100644
--- a/src/examples/CMakeLists.txt
+++ b/src/examples/CMakeLists.txt
@@ -2,3 +2,8 @@
 ADD_EXECUTABLE(bno055_imu_driver_test bno055_imu_driver_test.cpp)
 # link necessary libraries
 TARGET_LINK_LIBRARIES(bno055_imu_driver_test bno055_imu_driver)
+
+# create an example application
+ADD_EXECUTABLE(bno055_imu_sim_test bno055_imu_sim_test.cpp)
+# link necessary libraries
+TARGET_LINK_LIBRARIES(bno055_imu_sim_test bno055_imu_sim)
diff --git a/src/examples/bno055_imu_driver_test.cpp b/src/examples/bno055_imu_driver_test.cpp
index 7553f9a90cc9fe4dd82c4992fd19090cda2bdb36..d5722fe25b428aa81feaefa8f232943e817432f0 100644
--- a/src/examples/bno055_imu_driver_test.cpp
+++ b/src/examples/bno055_imu_driver_test.cpp
@@ -14,7 +14,7 @@ int main(int argc, char *argv[])
     std::vector<double> quat,euler,linear_acc,gravity;
     unsigned int i;
 
-    imu.open("/dev/ttyUSB1");
+    imu.open("/dev/pts/23");
     try{
       imu.load_calibration("bno055.cal");
       do{
diff --git a/src/examples/bno055_imu_sim_test.cpp b/src/examples/bno055_imu_sim_test.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..1c783f49ffd44956620e0b20de567b1ea486fd85
--- /dev/null
+++ b/src/examples/bno055_imu_sim_test.cpp
@@ -0,0 +1,19 @@
+#include "bno055_imu_sim.h"
+#include "bno055_imu_exceptions.h"
+#include <unistd.h>
+#include <iostream>
+
+int main(int argc, char *argv[])
+{
+  try{
+    CBNO055IMUSim imu("darwin_imu","/dev/pts/23");
+
+    sleep(3);
+    imu.set_calibrated();
+
+    while(1);
+
+  }catch(CException &e){
+    std::cout << e.what() << std::endl;
+  }
+}