diff --git a/include/collision_manager_alg_node.h b/include/collision_manager_alg_node.h
index e056f513aaaebed1475038bd9ef3d21181a7ad11..66c6564a3fc030eeb7eaef17200aa7315880602b 100644
--- a/include/collision_manager_alg_node.h
+++ b/include/collision_manager_alg_node.h
@@ -371,17 +371,21 @@ class CollisionManagerAlgNode : public algorithm_base::IriBaseAlgorithm<Collisio
      * 
      * \param _covariances Laser pose covariances from ICP.
      * 
-     * \param _odom The 2D base link pose.
+     * \param _odom The 2D base link pose on odom frames.
      * 
-     * \param _odom_cov Its covariances.
+     * \param _odom_cov Its covariances on odom frames.
      * 
-     * \param _odom_diff The ICP displacment on odom frame.
+     * \param _odom_diff The ICP displacement on odom frame.
+     * 
+     * \param _odom_diff_blink The ICP displacement on blink frame.
+     * 
+     * \param _odom_blink_cov Its covariances on blink frame.
      * 
      * \param _front To select the laser.
      * 
      * \return True if succeeded.
      */
-    bool get_icp_odometry(const Eigen::Vector3d& _new_laser_pose, const Eigen::Matrix3d& _covariances, Eigen::Vector3d& _odom, Eigen::Matrix3d& _odom_cov, Eigen::Vector3d& _odom_diff, const bool _front);
+    bool get_icp_odometry(const Eigen::Vector3d& _new_laser_pose, const Eigen::Matrix3d& _covariances, Eigen::Vector3d& _odom, Eigen::Matrix3d& _odom_cov, Eigen::Vector3d& _odom_diff, Eigen::Vector3d& _odom_diff_blink, Eigen::Matrix3d& _odom_blink_cov, const bool _front);
 
     /**
      * \brief Function to compare the odometry with the ICP to check that is actually a collision.
@@ -399,9 +403,9 @@ class CollisionManagerAlgNode : public algorithm_base::IriBaseAlgorithm<Collisio
      * 
      * It checks that ICP result is good enough and calculates the pose.
      * 
-     * \param _new_laser_pose New laser pose from ICP.
+     * \param _icp_odom_diff ICP differential odometry in odom frame.
      * 
-     * \param _covariances Laser pose covariances from ICP.
+     * \param _icp_covariances Laser pose covariances from ICP.
      * 
      * \param _blink_icp ICP on base link frame.
      * 
@@ -411,7 +415,7 @@ class CollisionManagerAlgNode : public algorithm_base::IriBaseAlgorithm<Collisio
      * 
      * \return True if succeeded.
      */
-    bool rotate_icp_to_blink(const Eigen::Vector3d& _new_laser_pose, const Eigen::Matrix3d& _covariances, Eigen::Vector3d& _blink_icp, Eigen::Matrix3d& _blink_icp_cov, const bool _front);
+    // bool icp_odometry_to_blink(const Eigen::Vector3d& _icp_odom_diff, const Eigen::Matrix3d& _icp_covariances, Eigen::Vector3d& _blink_icp, Eigen::Matrix3d& _blink_icp_cov, const bool _front);
 
    /**
     * \brief main node thread
diff --git a/src/collision_manager_alg_node.cpp b/src/collision_manager_alg_node.cpp
index f762fe2f748f24a5020cf3a2bf53d1937a55abbb..248af575b1b8547f82ff863554b56ef89143b05e 100644
--- a/src/collision_manager_alg_node.cpp
+++ b/src/collision_manager_alg_node.cpp
@@ -232,7 +232,7 @@ void CollisionManagerAlgNode::mainNodeThread(void)
                   this->tf2_broadcaster.sendTransform(this->transform_msg);
                 }
 
-                if (get_icp_odometry(new_laser_pose, covariances, icp_odometry, icp_odom_cov, icp_odometry_diff, true))
+                if (get_icp_odometry(new_laser_pose, covariances, icp_odometry, icp_odom_cov, icp_odometry_diff, blink_icp, blink_icp_cov, true))
                 {
                   icp_odom_calculated = true;
                   // ROS_INFO_STREAM("Odom before collision " << this->odom_before_collision_);
@@ -254,23 +254,6 @@ void CollisionManagerAlgNode::mainNodeThread(void)
                     ROS_WARN("CollisionManagerAlgNode::mainNodeThread -> Not enough points or too much error on front ICP. Not valid to check if is a collision");
                     icp_is_collision = false;
                   }
-                  else
-                  {
-                    this->relocalization_msg_.front_blink_pose.x = blink_pose(0);
-                    this->relocalization_msg_.front_blink_pose.y = blink_pose(1);
-                    this->relocalization_msg_.front_blink_pose.theta = blink_pose(2);
-                    for (unsigned int i=0; i<9; i++)
-                      this->relocalization_msg_.front_pose_covariance[i] = blink_cov(i);
-                    if (rotate_icp_to_blink(new_laser_pose, covariances, blink_icp, blink_icp_cov, true))
-                    {
-                      this->relocalization_msg_.front_icp_check = true;
-                      this->relocalization_msg_.front_icp_odom.x = blink_icp(0);
-                      this->relocalization_msg_.front_icp_odom.y = blink_icp(1);
-                      this->relocalization_msg_.front_icp_odom.theta = blink_icp(2);
-                      for (unsigned int i=0; i<9; i++)
-                        this->relocalization_msg_.front_odom_covariance[i] = blink_icp_cov(i);
-                    }
-                  }
                 }
                 else
                 {
@@ -293,6 +276,21 @@ void CollisionManagerAlgNode::mainNodeThread(void)
                 ROS_ERROR("CollisionManagerAlgNode::mainNodeThread -> Failed to call service on topic %s",this->icp_client_.getService().c_str());
               }
               this->collision_msg_.front_icp_check = icp_is_collision;
+              if (icp_is_collision)
+              {
+                this->relocalization_msg_.front_icp_check = true;
+                this->relocalization_msg_.front_blink_pose.x = blink_pose(0);
+                this->relocalization_msg_.front_blink_pose.y = blink_pose(1);
+                this->relocalization_msg_.front_blink_pose.theta = blink_pose(2);
+                for (unsigned int i=0; i<9; i++)
+                  this->relocalization_msg_.front_pose_covariance[i] = blink_cov(i);
+
+                this->relocalization_msg_.front_icp_odom.x = blink_icp(0);
+                this->relocalization_msg_.front_icp_odom.y = blink_icp(1);
+                this->relocalization_msg_.front_icp_odom.theta = blink_icp(2);
+                for (unsigned int i=0; i<9; i++)
+                  this->relocalization_msg_.front_odom_covariance[i] = blink_icp_cov(i);
+              }
               if (this->config_.debug)
               {
                 this->debug_front_icp_last_scan_publisher_.publish(this->debug_front_icp_last_scan_msg_);
@@ -347,7 +345,7 @@ void CollisionManagerAlgNode::mainNodeThread(void)
                   this->tf2_broadcaster.sendTransform(this->transform_msg);
                 }
 
-                if (get_icp_odometry(new_laser_pose, covariances, icp_odometry, icp_odom_cov, icp_odometry_diff, true))
+                if (get_icp_odometry(new_laser_pose, covariances, icp_odometry, icp_odom_cov, icp_odometry_diff, blink_icp, blink_icp_cov, false))
                 {
                   icp_odom_calculated = true;
                   // ROS_INFO_STREAM("Odom before collision " << this->odom_before_collision_);
@@ -369,23 +367,6 @@ void CollisionManagerAlgNode::mainNodeThread(void)
                     ROS_WARN("CollisionManagerAlgNode::mainNodeThread -> Not enough points or too much error on rear ICP. Not valid to check if is a collision");
                     icp_is_collision = false;
                   }
-                  else
-                  {
-                    this->relocalization_msg_.rear_blink_pose.x = blink_pose(0);
-                    this->relocalization_msg_.rear_blink_pose.y = blink_pose(1);
-                    this->relocalization_msg_.rear_blink_pose.theta = blink_pose(2);
-                    for (unsigned int i=0; i<9; i++)
-                      this->relocalization_msg_.rear_pose_covariance[i] = blink_cov(i);
-                    if (rotate_icp_to_blink(new_laser_pose, covariances, blink_icp, blink_icp_cov, false))
-                    {
-                      this->relocalization_msg_.rear_icp_check = true;
-                      this->relocalization_msg_.rear_icp_odom.x = blink_icp(0);
-                      this->relocalization_msg_.rear_icp_odom.y = blink_icp(1);
-                      this->relocalization_msg_.rear_icp_odom.theta = blink_icp(2);
-                      for (unsigned int i=0; i<9; i++)
-                        this->relocalization_msg_.rear_odom_covariance[i] = blink_icp_cov(i);
-                    }
-                  }
                 }
                 else
                 {
@@ -408,6 +389,21 @@ void CollisionManagerAlgNode::mainNodeThread(void)
                 ROS_ERROR("CollisionManagerAlgNode::mainNodeThread -> Failed to call service on topic %s",this->icp_client_.getService().c_str());
               }
               this->collision_msg_.rear_icp_check = icp_is_collision;
+              if (icp_is_collision)
+              {
+                this->relocalization_msg_.rear_icp_check = true;
+                this->relocalization_msg_.rear_blink_pose.x = blink_pose(0);
+                this->relocalization_msg_.rear_blink_pose.y = blink_pose(1);
+                this->relocalization_msg_.rear_blink_pose.theta = blink_pose(2);
+                for (unsigned int i=0; i<9; i++)
+                  this->relocalization_msg_.rear_pose_covariance[i] = blink_cov(i);
+
+                this->relocalization_msg_.rear_icp_odom.x = blink_icp(0);
+                this->relocalization_msg_.rear_icp_odom.y = blink_icp(1);
+                this->relocalization_msg_.rear_icp_odom.theta = blink_icp(2);
+                for (unsigned int i=0; i<9; i++)
+                  this->relocalization_msg_.rear_odom_covariance[i] = blink_icp_cov(i);
+              }
               if (this->config_.debug)
               {
                 this->debug_rear_icp_last_scan_publisher_.publish(this->debug_rear_icp_last_scan_msg_);
@@ -784,11 +780,12 @@ bool CollisionManagerAlgNode::get_base_link_new_pose_from_icp(const Eigen::Vecto
   return true;
 }
 
-bool CollisionManagerAlgNode::get_icp_odometry(const Eigen::Vector3d& _new_laser_pose, const Eigen::Matrix3d& _covariances, Eigen::Vector3d& _odom, Eigen::Matrix3d& _odom_cov, Eigen::Vector3d& _odom_diff, const bool _front)
+bool CollisionManagerAlgNode::get_icp_odometry(const Eigen::Vector3d& _new_laser_pose, const Eigen::Matrix3d& _covariances, Eigen::Vector3d& _odom, Eigen::Matrix3d& _odom_cov, Eigen::Vector3d& _odom_diff, Eigen::Vector3d& _odom_diff_blink, Eigen::Matrix3d& _odom_blink_cov, const bool _front)
 {
   geometry_msgs::TransformStamped tf_aux;
   tf2::Transform tf_odom_laser, tf_odom_new_laser, tf_laser_new_laser, tf_odom_new_blink, tf_odom_blink;
   Eigen::Vector3d old_odom;
+  Eigen::Matrix3d rot_odom_blink;
   ros::Time t = this->collision_start_stamp_ - ros::Duration(this->config_.scan_diff_t_from_collision);
 
   if (!load_tf_blink_laser(_front))
@@ -832,15 +829,24 @@ bool CollisionManagerAlgNode::get_icp_odometry(const Eigen::Vector3d& _new_laser
   Eigen::Transform<double,3,Eigen::Affine> odom_laser_rot(rot);
   _odom_cov = odom_laser_rot.rotation()*_covariances*odom_laser_rot.rotation().transpose();
 
-  // for (unsigned int i=0; i<9; i++)
-  //   _odom_cov(i) = std::fabs(_odom_cov(i))*(_covariances(i) < 0? -1: 1);
-
   _odom_diff = _odom - old_odom;
   while (_odom_diff(2) >= M_PI)
     _odom_diff(2) -= 2*M_PI;
   while (_odom_diff(2) < -M_PI)
     _odom_diff(2) += 2*M_PI;
 
+  rot = Eigen::Quaternion<double>((_front? this->tf_blink_front_laser_: this->tf_blink_rear_laser_).getRotation().w(), 
+                                (_front? this->tf_blink_front_laser_: this->tf_blink_rear_laser_).getRotation().x(),
+                                (_front? this->tf_blink_front_laser_: this->tf_blink_rear_laser_).getRotation().y(), 
+                                (_front? this->tf_blink_front_laser_: this->tf_blink_rear_laser_).getRotation().z());
+  Eigen::Transform<double,3,Eigen::Affine> blink_laser_rot(rot);
+  _odom_blink_cov = blink_laser_rot.rotation()*_covariances*blink_laser_rot.rotation().transpose();
+
+  rot_odom_blink << cos(old_odom[2]), sin(old_odom[2]), 0.0,
+                    -sin(old_odom[2]), cos(old_odom[2]), 0.0,
+                    0.0, 0.0, 1.0;
+  _odom_diff_blink = rot_odom_blink*_odom_diff;
+
   return true;
 }
 
@@ -902,27 +908,27 @@ bool CollisionManagerAlgNode::check_odometry_diff(const Eigen::Vector3d& _icp_od
   return (odom_check(0) || odom_check(1) || odom_check(2));
 }
 
-bool CollisionManagerAlgNode::rotate_icp_to_blink(const Eigen::Vector3d& _new_laser_pose, const Eigen::Matrix3d& _covariances, Eigen::Vector3d& _blink_icp, Eigen::Matrix3d& _blink_icp_cov, const bool _front)
-{
-  if (!load_tf_blink_laser(_front))
-    return false;
-
-  Eigen::Quaternion<double> rot((_front? this->tf_blink_front_laser_: this->tf_blink_rear_laser_).getRotation().w(), 
-                                (_front? this->tf_blink_front_laser_: this->tf_blink_rear_laser_).getRotation().x(),
-                                (_front? this->tf_blink_front_laser_: this->tf_blink_rear_laser_).getRotation().y(), 
-                                (_front? this->tf_blink_front_laser_: this->tf_blink_rear_laser_).getRotation().z());
-  Eigen::Transform<double,3,Eigen::Affine> blink_laser_rot(rot);
-
-  Eigen::Vector3d aux;
-  aux << _new_laser_pose(0), _new_laser_pose(1), 0.0;
-  _blink_icp = blink_laser_rot*aux;
-  if ((_front? this->z_axis_blink_front_laser_inv_: this->z_axis_blink_rear_laser_inv_))
-    _blink_icp(2) = _new_laser_pose(2)*-1.0;
-  else
-    _blink_icp(2) = _new_laser_pose(2);
-  _blink_icp_cov = blink_laser_rot.rotation()*_covariances*blink_laser_rot.rotation().transpose();
-  return true;
-}
+// bool CollisionManagerAlgNode::icp_odometry_to_blink(const Eigen::Vector3d& _icp_odom_diff, const Eigen::Matrix3d& _icp_covariances, Eigen::Vector3d& _blink_icp, Eigen::Matrix3d& _blink_icp_cov, const bool _front)
+// {
+//   if (!load_tf_blink_laser(_front))
+//     return false;
+
+//   Eigen::Quaternion<double> rot((_front? this->tf_blink_front_laser_: this->tf_blink_rear_laser_).getRotation().w(), 
+//                                 (_front? this->tf_blink_front_laser_: this->tf_blink_rear_laser_).getRotation().x(),
+//                                 (_front? this->tf_blink_front_laser_: this->tf_blink_rear_laser_).getRotation().y(), 
+//                                 (_front? this->tf_blink_front_laser_: this->tf_blink_rear_laser_).getRotation().z());
+//   Eigen::Transform<double,3,Eigen::Affine> blink_laser_rot(rot);
+
+//   Eigen::Vector3d aux;
+//   aux << _new_laser_pose(0), _new_laser_pose(1), 0.0;
+//   _blink_icp = blink_laser_rot*aux;
+//   if ((_front? this->z_axis_blink_front_laser_inv_: this->z_axis_blink_rear_laser_inv_))
+//     _blink_icp(2) = _new_laser_pose(2)*-1.0;
+//   else
+//     _blink_icp(2) = _new_laser_pose(2);
+//   _blink_icp_cov = blink_laser_rot.rotation()*_icp_covariances*blink_laser_rot.rotation().transpose();
+//   return true;
+// }
 
 /*  [subscriber callbacks] */
 void CollisionManagerAlgNode::odom_callback(const nav_msgs::Odometry::ConstPtr& msg)