diff --git a/cfg/ImuMsgFix.cfg b/cfg/ImuMsgFix.cfg
index cc677fcb7aa41bcd6d66c1be9c59a31a1580817d..4fb2a3cc2a26baad87446b38861888d052e73310 100755
--- a/cfg/ImuMsgFix.cfg
+++ b/cfg/ImuMsgFix.cfg
@@ -37,12 +37,20 @@ from dynamic_reconfigure.parameter_generator_catkin import *
 
 gen = ParameterGenerator()
 
+enum_imu_reference = gen.enum([ 
+gen.const("NED", int_t, 0, "North East Down"),
+gen.const("ENU", int_t, 1, "East North Up"),
+], "Possible reference systems for the IMU.")
+
+
 #       Name                       Type       Reconfiguration level            Description                       Default   Min   Max
 #gen.add("velocity_scale_factor",  double_t,  0,                               "Maximum velocity scale factor",  0.5,      0.0,  1.0)
-gen.add("frame_id",  str_t,  0,                               "frame_id name to override msg with",  "")
-gen.add("fix_cov",   bool_t,  0,                              "enable covariance fix",  False)
-gen.add("cov_orientation", double_t,  0,   "orientation covariance value to be set",  0.01, 0.0, 100.0)
-gen.add("cov_vel",         double_t,  0,   "velocity covariance value to be set",     0.000001, 0.0, 100.0)
-gen.add("cov_acc",         double_t,  0,   "acceleration covariance value to be set", 0.000001, 0.0, 100.0)
+gen.add("fix_frame_id",            bool_t,    0,                               "enable frame_id fix",  False)
+gen.add("frame_id",                str_t,     0,                               "frame_id name to override msg with",  "")
+gen.add("fix_cov",                 bool_t,    0,                               "enable covariance fix",  False)
+gen.add("cov_orientation",         double_t,  0,                               "orientation covariance value to be set",  0.01, 0.0, 100.0)
+gen.add("cov_vel",                 double_t,  0,                               "velocity covariance value to be set",     0.000001, 0.0, 100.0)
+gen.add("cov_acc",                 double_t,  0,                               "acceleration covariance value to be set", 0.000001, 0.0, 100.0)
+gen.add("imu_reference",           int_t,     0,                               "IMU reference system",           0,       0,    1, edit_method=enum_imu_reference)
 
 exit(gen.generate(PACKAGE, "ImuMsgFixAlgorithm", "ImuMsgFix"))
diff --git a/include/imu_msg_fix_alg_node.h b/include/imu_msg_fix_alg_node.h
index 01a0688780b94afa6a8796295362a9052c6e3247..9a3b16b9cc37104cc685b4a76acfb2189821993d 100755
--- a/include/imu_msg_fix_alg_node.h
+++ b/include/imu_msg_fix_alg_node.h
@@ -44,13 +44,9 @@ class ImuMsgFixAlgNode : public algorithm_base::IriBaseAlgorithm<ImuMsgFixAlgori
 {
   private:
     // [publisher attributes]
-    ros::Publisher pose_publisher_;
-    geometry_msgs::PoseStamped pose_PoseStamped_msg_;
-
     ros::Publisher imu_out_publisher_;
     sensor_msgs::Imu imu_out_Imu_msg_;
 
-
     // [subscriber attributes]
     ros::Subscriber imu_in_subscriber_;
     void imu_in_callback(const sensor_msgs::Imu::ConstPtr& msg);
@@ -58,7 +54,6 @@ class ImuMsgFixAlgNode : public algorithm_base::IriBaseAlgorithm<ImuMsgFixAlgori
     void imu_in_mutex_enter(void);
     void imu_in_mutex_exit(void);
 
-
     // [service attributes]
 
     // [client attributes]
diff --git a/launch/node.launch b/launch/node.launch
index 5e05de8d8263592fbb4c7ef54c2b60f28c227ad7..2095b069b6d6864f38a907d22f68fa1e1cea0c20 100755
--- a/launch/node.launch
+++ b/launch/node.launch
@@ -6,5 +6,6 @@
   <node pkg="imu_msg_fix" name="imu_msg_fix" type="imu_msg_fix" output="screen">
     <remap from="~imu_in" to="$(arg imu_in)"/>
     <remap from="~imu_out" to="$(arg imu_out)"/>
+    
   </node>
-</launch>
\ No newline at end of file
+</launch>
diff --git a/src/imu_msg_fix_alg_node.cpp b/src/imu_msg_fix_alg_node.cpp
index 957fea1a940f4f28933ceeb0614aaf5cd1f1740e..de0786c7a79d14dd5ed8dceaa299f5c4fd077685 100755
--- a/src/imu_msg_fix_alg_node.cpp
+++ b/src/imu_msg_fix_alg_node.cpp
@@ -7,13 +7,11 @@ ImuMsgFixAlgNode::ImuMsgFixAlgNode(void) :
   //this->loop_rate_ = 2;//in [Hz]
 
   // [init publishers]
-  this->pose_publisher_ = this->public_node_handle_.advertise<geometry_msgs::PoseStamped>("pose", 1);
   this->imu_out_publisher_ = this->public_node_handle_.advertise<sensor_msgs::Imu>("imu_out", 1);
   
   // [init subscribers]
   this->imu_in_subscriber_ = this->public_node_handle_.subscribe("imu_in", 1, &ImuMsgFixAlgNode::imu_in_callback, this);
   pthread_mutex_init(&this->imu_in_mutex_,NULL);
-
   
   // [init services]
   
@@ -61,37 +59,94 @@ void ImuMsgFixAlgNode::imu_in_callback(const sensor_msgs::Imu::ConstPtr& msg)
   //use appropiate mutex to shared variables if necessary
   //this->alg_.lock();
   //this->imu_in_mutex_enter();
-  this->imu_out_Imu_msg_ = *msg;
   std::string frame;
-  if(this->config_.frame_id.size()!=0)
-  {
+  if(this->config_.fix_frame_id)
     frame=this->config_.frame_id;
-  }
   else
   {
-    frame = this->imu_out_Imu_msg_.header.frame_id;
-    
-    //if(!strncmp(frame, "/", strlen("/")))
+    frame = msg->header.frame_id;
     if(frame[0]=='/')
       frame.erase (0,1);
   }
   
-  if(this->config_.fix_cov)
+  if(this->config_.imu_reference==1)
   {
-    this->imu_out_Imu_msg_.orientation_covariance[0]=this->config_.cov_orientation;
-    this->imu_out_Imu_msg_.orientation_covariance[4]=this->config_.cov_orientation;
-    this->imu_out_Imu_msg_.orientation_covariance[8]=this->config_.cov_orientation;
+    if(this->config_.fix_cov)
+    {
+      this->imu_out_Imu_msg_.orientation_covariance[0]=this->config_.cov_orientation;
+      this->imu_out_Imu_msg_.orientation_covariance[4]=this->config_.cov_orientation;
+      this->imu_out_Imu_msg_.orientation_covariance[8]=this->config_.cov_orientation;
     
-    this->imu_out_Imu_msg_.angular_velocity_covariance[0]=this->config_.cov_vel;
-    this->imu_out_Imu_msg_.angular_velocity_covariance[4]=this->config_.cov_vel;
-    this->imu_out_Imu_msg_.angular_velocity_covariance[8]=this->config_.cov_vel;
+      this->imu_out_Imu_msg_.angular_velocity_covariance[0]=this->config_.cov_vel;
+      this->imu_out_Imu_msg_.angular_velocity_covariance[4]=this->config_.cov_vel;
+      this->imu_out_Imu_msg_.angular_velocity_covariance[8]=this->config_.cov_vel;
     
-    this->imu_out_Imu_msg_.linear_acceleration_covariance[0]=this->config_.cov_acc;
-    this->imu_out_Imu_msg_.linear_acceleration_covariance[4]=this->config_.cov_acc;
-    this->imu_out_Imu_msg_.linear_acceleration_covariance[8]=this->config_.cov_acc;
+      this->imu_out_Imu_msg_.linear_acceleration_covariance[0]=this->config_.cov_acc;
+      this->imu_out_Imu_msg_.linear_acceleration_covariance[4]=this->config_.cov_acc;
+      this->imu_out_Imu_msg_.linear_acceleration_covariance[8]=this->config_.cov_acc;
+    }
+    else 
+    {
+      this->imu_out_Imu_msg_.orientation_covariance[0]=msg->orientation_covariance[4];
+      this->imu_out_Imu_msg_.orientation_covariance[1]=msg->orientation_covariance[3];
+      this->imu_out_Imu_msg_.orientation_covariance[4]=msg->orientation_covariance[0];
+      this->imu_out_Imu_msg_.orientation_covariance[3]=msg->orientation_covariance[1];
+      this->imu_out_Imu_msg_.orientation_covariance[8]=msg->orientation_covariance[8];
+    
+      this->imu_out_Imu_msg_.angular_velocity_covariance[0]=msg->angular_velocity_covariance[4];
+      this->imu_out_Imu_msg_.angular_velocity_covariance[1]=msg->angular_velocity_covariance[3];
+      this->imu_out_Imu_msg_.angular_velocity_covariance[4]=msg->angular_velocity_covariance[0];
+      this->imu_out_Imu_msg_.angular_velocity_covariance[3]=msg->angular_velocity_covariance[1];
+      this->imu_out_Imu_msg_.angular_velocity_covariance[8]=msg->angular_velocity_covariance[8];
+    
+      this->imu_out_Imu_msg_.linear_acceleration_covariance[0]=msg->linear_acceleration_covariance[4];
+      this->imu_out_Imu_msg_.linear_acceleration_covariance[1]=msg->linear_acceleration_covariance[3];
+      this->imu_out_Imu_msg_.linear_acceleration_covariance[4]=msg->linear_acceleration_covariance[0];
+      this->imu_out_Imu_msg_.linear_acceleration_covariance[3]=msg->linear_acceleration_covariance[1];
+      this->imu_out_Imu_msg_.linear_acceleration_covariance[8]=msg->linear_acceleration_covariance[8];
+    }
+    this->imu_out_Imu_msg_.orientation.x=msg->orientation.y;
+    this->imu_out_Imu_msg_.orientation.y=msg->orientation.x;
+    this->imu_out_Imu_msg_.orientation.z=-msg->orientation.z;
+    this->imu_out_Imu_msg_.orientation.w=-msg->orientation.w;
+
+    this->imu_out_Imu_msg_.angular_velocity.x=msg->angular_velocity.y;
+    this->imu_out_Imu_msg_.angular_velocity.y=msg->angular_velocity.x;
+    this->imu_out_Imu_msg_.angular_velocity.z=-msg->angular_velocity.z;
+
+    this->imu_out_Imu_msg_.linear_acceleration.x=msg->linear_acceleration.y;
+    this->imu_out_Imu_msg_.linear_acceleration.y=msg->linear_acceleration.x;
+    this->imu_out_Imu_msg_.linear_acceleration.z=-msg->linear_acceleration.z;
   }
-  
+  else
+  {
+    if(this->config_.fix_cov)
+    {
+      this->imu_out_Imu_msg_.orientation_covariance[0]=this->config_.cov_orientation;
+      this->imu_out_Imu_msg_.orientation_covariance[4]=this->config_.cov_orientation;
+      this->imu_out_Imu_msg_.orientation_covariance[8]=this->config_.cov_orientation;
+    
+      this->imu_out_Imu_msg_.angular_velocity_covariance[0]=this->config_.cov_vel;
+      this->imu_out_Imu_msg_.angular_velocity_covariance[4]=this->config_.cov_vel;
+      this->imu_out_Imu_msg_.angular_velocity_covariance[8]=this->config_.cov_vel;
+    
+      this->imu_out_Imu_msg_.linear_acceleration_covariance[0]=this->config_.cov_acc;
+      this->imu_out_Imu_msg_.linear_acceleration_covariance[4]=this->config_.cov_acc;
+      this->imu_out_Imu_msg_.linear_acceleration_covariance[8]=this->config_.cov_acc;
+    }
+    else 
+    {
+      this->imu_out_Imu_msg_.orientation_covariance=msg->orientation_covariance;
+      this->imu_out_Imu_msg_.angular_velocity_covariance=msg->angular_velocity_covariance;
+      this->imu_out_Imu_msg_.linear_acceleration_covariance=msg->linear_acceleration_covariance;
+    }
+    this->imu_out_Imu_msg_.orientation=msg->orientation;
+    this->imu_out_Imu_msg_.angular_velocity=msg->angular_velocity;
+    this->imu_out_Imu_msg_.linear_acceleration=msg->linear_acceleration;
+  }
+
   this->imu_out_Imu_msg_.header.frame_id = frame;
+  this->imu_out_Imu_msg_.header.stamp = msg->header.stamp;
   this->imu_out_publisher_.publish(this->imu_out_Imu_msg_);
   
 //   this->pose_PoseStamped_msg_.header = msg->header;