diff --git a/src/adc_landmarks_slam_solver_alg.cpp b/src/adc_landmarks_slam_solver_alg.cpp
index a695b5b68d2bcecbe623224b841b01c3a1b78027..7d8067ec726d3b2aeb889ed09da76645127ac951 100644
--- a/src/adc_landmarks_slam_solver_alg.cpp
+++ b/src/adc_landmarks_slam_solver_alg.cpp
@@ -168,7 +168,7 @@ double AdcLandmarksSlamSolverAlgorithm::is_a_mapped_landmark(Eigen::Vector3d _fe
 
       geometry_msgs::PoseStamped local_land, global_land;
       global_land.header.stamp = _tf_sensor_map.header.stamp;
-      global_land.header.frame_id = this->config_.global_frame;
+      global_land.header.frame_id = _tf_sensor_map.child_frame_id;//global_frame
       global_land.pose.position.z = 0.0;
       global_land.pose.position.x = it->second.pose(0);
       global_land.pose.position.y = it->second.pose(1);
diff --git a/src/adc_landmarks_slam_solver_alg_node.cpp b/src/adc_landmarks_slam_solver_alg_node.cpp
index dd44955064e49c454add4f675f2cf699c54f86c8..a5fd3b37394c080c706e528131cc921fdb5e4159 100644
--- a/src/adc_landmarks_slam_solver_alg_node.cpp
+++ b/src/adc_landmarks_slam_solver_alg_node.cpp
@@ -204,6 +204,7 @@ void AdcLandmarksSlamSolverAlgNode::mainNodeThread(void)
 {
   //lock access to algorithm if necessary
   // this->alg_.lock();
+  this->rear_features_mutex_enter();
   this->front_features_mutex_enter();
   this->estimated_pose_mutex_enter();
   // ROS_DEBUG("AdcLandmarksSlamSolverAlgNode::mainNodeThread");
@@ -274,6 +275,7 @@ void AdcLandmarksSlamSolverAlgNode::mainNodeThread(void)
         // this->new_estimated_pose_ = false;
         this->estimated_pose_mutex_exit();
         this->front_features_mutex_exit();
+        this->rear_features_mutex_exit();
         return;
       }
       tf_odom_base_msg = this->tf2_buffer.lookupTransform(this->config_.odom_frame, this->config_.base_link_frame, this->new_estimated_pose_t_);
@@ -351,6 +353,7 @@ void AdcLandmarksSlamSolverAlgNode::mainNodeThread(void)
             // this->new_front_features_data_ = false;
             this->estimated_pose_mutex_exit();
             this->front_features_mutex_exit();
+            this->rear_features_mutex_exit();
             return;
           }
           //Get global robot_state
@@ -363,6 +366,7 @@ void AdcLandmarksSlamSolverAlgNode::mainNodeThread(void)
               // this->new_front_features_data_ = false;
               this->estimated_pose_mutex_exit();
               this->front_features_mutex_exit();
+              this->rear_features_mutex_exit();
               return;
             }
           }
@@ -380,8 +384,10 @@ void AdcLandmarksSlamSolverAlgNode::mainNodeThread(void)
             if (!front_land_success || !rear_land_success)
             {
               // this->new_front_features_data_ = false;
+              this->new_features_data_ = false;
               this->estimated_pose_mutex_exit();
               this->front_features_mutex_exit();
+              this->rear_features_mutex_exit();
               return;
             }
           }
@@ -457,6 +463,7 @@ void AdcLandmarksSlamSolverAlgNode::mainNodeThread(void)
           }
           this->estimated_pose_mutex_exit();
           this->front_features_mutex_exit();
+          this->rear_features_mutex_exit();
           return;
         }
         tf_robot = this->tf2_buffer.lookupTransform(this->config_.global_frame, this->config_.base_link_frame, t);
@@ -539,6 +546,7 @@ void AdcLandmarksSlamSolverAlgNode::mainNodeThread(void)
   // this->alg_.unlock();
   this->estimated_pose_mutex_exit();
   this->front_features_mutex_exit();
+  this->rear_features_mutex_exit();
 }
 
 bool AdcLandmarksSlamSolverAlgNode::check_landmarks(bool _update_landmarks, bool _front)
@@ -550,7 +558,7 @@ bool AdcLandmarksSlamSolverAlgNode::check_landmarks(bool _update_landmarks, bool
 
   if ((_front && this->front_features_frame_ == "") || (!_front && this->rear_features_frame_ == ""))
   {
-    ROS_DEBUG_STREAM("AdcLandmarksSlamSolverAlgNode::check_landmarks -> " << (_front? "front ": "rear ") << "features frame id empty; AR tag filter not initialized.");
+    ROS_WARN_STREAM("AdcLandmarksSlamSolverAlgNode::check_landmarks -> " << (_front? "front ": "rear ") << "features frame id empty; AR tag filter not initialized.");
     return false;
   }
 
@@ -705,7 +713,7 @@ bool AdcLandmarksSlamSolverAlgNode::is_a_new_landmark(FeatureInfo &_feature, boo
 
       geometry_msgs::PoseStamped local_land, global_land;
       global_land.header.stamp = _tf_sensor_map.header.stamp;
-      global_land.header.frame_id = this->config_.global_frame;
+      global_land.header.frame_id = _tf_sensor_map.child_frame_id;//global
       global_land.pose.position.z = 0.0;
       global_land.pose.position.x = it->pose(0);
       global_land.pose.position.y = it->pose(1);
@@ -756,9 +764,17 @@ bool AdcLandmarksSlamSolverAlgNode::is_a_new_landmark(FeatureInfo &_feature, boo
 
 bool AdcLandmarksSlamSolverAlgNode::update_landmarks_frame_data(FrameData& _frame_data, bool _front)
 {
+  if ((_front && this->front_features_frame_ == "") || (!_front && this->rear_features_frame_ == ""))
+  {
+    ROS_WARN_STREAM("AdcLandmarksSlamSolverAlgNode::update_landmarks_frame_data -> " << (_front? "front ": "rear ") << "features frame id empty; AR tag filter not initialized.");
+    return false;
+  }
   //calculate tf from base_link to sensor
   geometry_msgs::TransformStamped tf;
   geometry_msgs::PoseStamped from_sensor, from_base_link;
+  tf.header.frame_id = this->config_.base_link_frame;
+  tf.child_frame_id = (_front? this->front_features_frame_: this->rear_features_frame_);
+  tf.header.stamp = this->features_stamp_;
   if (!this->tf2_buffer.canTransform(this->config_.base_link_frame, (_front? this->front_features_frame_: this->rear_features_frame_), this->features_stamp_, ros::Duration(this->config_.tf_timeout)))
   {
     ROS_WARN_STREAM("AdcLandmarksSlamSolverAlgNode:update_landmarks_frame_data -> Can't transform from " << this->config_.base_link_frame << " to " << (_front? this->front_features_frame_: this->rear_features_frame_) << " at " << this->features_stamp_);
@@ -769,7 +785,7 @@ bool AdcLandmarksSlamSolverAlgNode::update_landmarks_frame_data(FrameData& _fram
   from_sensor.header.frame_id = (_front? this->front_features_frame_: this->rear_features_frame_);
   for (unsigned int i = 0; i < (_front? this->front_features_: this->rear_features_).size(); i++)
   {
-    if(this->front_features_[i].landmark_key > 0.0)
+    if((_front? this->front_features_: this->rear_features_)[i].landmark_key > 0.0)
     {
       LandmarkResidualData land_res_data;
       // Transform sensor info to base_link frame
@@ -874,6 +890,7 @@ void AdcLandmarksSlamSolverAlgNode::load_landmarks(void)
 void AdcLandmarksSlamSolverAlgNode::merge_features()
 {
   std::vector<FeatureInfo>().swap(this->features_);
+  this->features_.clear();
   if (this->new_rear_features_data_ && (this->features_stamp_ - this->rear_features_stamp_) < ros::Duration(this->config_.old_feature_timeout))
   {
     this->features_.resize(this->rear_features_.size());
@@ -886,6 +903,7 @@ void AdcLandmarksSlamSolverAlgNode::merge_features()
       ROS_WARN_STREAM("AdcLandmarksSlamSolverAlgNode::merge_features -> rear features too old: last stamp " << this->rear_features_stamp_);
     this->new_rear_features_data_ = false;
   }
+
   if (this->new_front_features_data_ && (this->features_stamp_ - this->front_features_stamp_) < ros::Duration(this->config_.old_feature_timeout))
   {
     unsigned int old_size = this->features_.size();
@@ -1145,19 +1163,30 @@ void AdcLandmarksSlamSolverAlgNode::front_features_callback(const iri_adc_msgs::
   this->features_stamp_ = msg->header.stamp;
   this->new_front_features_data_ = true;
   this->new_features_data_ = true;
-  this->front_features_.resize(msg->features.size());
-  for (unsigned int i = 0; i < msg->features.size(); i++)
+  if (msg->header.frame_id != "")
   {
-    FeatureInfo feature;
-    feature.msg_pose = msg->features[i].pose;
-    feature.landmark_key = -1.0;
-    feature.type = msg->features[i].type;
-    Eigen::Vector3d dist;
-    dist << msg->features[i].pose.position.x, msg->features[i].pose.position.y, msg->features[i].pose.position.z;
-    feature.r = dist.norm();
-    feature.th = std::atan2(msg->features[i].pose.position.x, msg->features[i].pose.position.z);
-    feature.frame = msg->header.frame_id;
-    this->front_features_[i] = feature;
+    this->front_features_.resize(msg->features.size());
+    for (unsigned int i = 0; i < msg->features.size(); i++)
+    {
+      FeatureInfo feature;
+      feature.msg_pose = msg->features[i].pose;
+      feature.landmark_key = -1.0;
+      feature.type = msg->features[i].type;
+      Eigen::Vector3d dist;
+      dist << msg->features[i].pose.position.x, msg->features[i].pose.position.y, msg->features[i].pose.position.z;
+      feature.r = dist.norm();
+      feature.th = std::atan2(msg->features[i].pose.position.x, msg->features[i].pose.position.z);
+      feature.frame = msg->header.frame_id;
+      this->front_features_[i] = feature;
+    }
+    // ROS_INFO_STREAM("Front features size " << (int)this->front_features_.size());
+  }
+  else
+  {
+    this->new_front_features_data_ = false;
+    std::vector<FeatureInfo>().swap(this->front_features_);
+    this->front_features_.clear();
+    // ROS_INFO_STREAM("Front features size " << (int)this->front_features_.size());
   }
 
   //std::cout << msg->data << std::endl;
@@ -1183,31 +1212,42 @@ void AdcLandmarksSlamSolverAlgNode::rear_features_callback(const iri_adc_msgs::f
 
   //use appropiate mutex to shared variables if necessary
   //this->alg_.lock();
-  this->front_features_mutex_enter();
+  this->rear_features_mutex_enter();
   this->rear_features_frame_ = msg->header.frame_id;
   this->rear_features_stamp_ = msg->header.stamp;
   this->features_stamp_ = msg->header.stamp;
   this->new_rear_features_data_ = true;
   this->new_features_data_ = true;
-  this->rear_features_.resize(msg->features.size());
-  for (unsigned int i = 0; i < msg->features.size(); i++)
+  if (msg->header.frame_id != "")
   {
-    FeatureInfo feature;
-    feature.msg_pose = msg->features[i].pose;
-    feature.landmark_key = -1.0;
-    feature.type = msg->features[i].type;
-    Eigen::Vector3d dist;
-    dist << msg->features[i].pose.position.x, msg->features[i].pose.position.y, msg->features[i].pose.position.z;
-    feature.r = dist.norm();
-    feature.th = std::atan2(msg->features[i].pose.position.x, msg->features[i].pose.position.z);
-    feature.frame = msg->header.frame_id;
-    this->rear_features_[i] = feature;
+    this->rear_features_.resize(msg->features.size());
+    for (unsigned int i = 0; i < msg->features.size(); i++)
+    {
+      FeatureInfo feature;
+      feature.msg_pose = msg->features[i].pose;
+      feature.landmark_key = -1.0;
+      feature.type = msg->features[i].type;
+      Eigen::Vector3d dist;
+      dist << msg->features[i].pose.position.x, msg->features[i].pose.position.y, msg->features[i].pose.position.z;
+      feature.r = dist.norm();
+      feature.th = std::atan2(msg->features[i].pose.position.x, msg->features[i].pose.position.z);
+      feature.frame = msg->header.frame_id;
+      this->rear_features_[i] = feature;
+      // ROS_INFO_STREAM("Rear features size " << (int)this->rear_features_.size());
+    }
+  }
+  else
+  {
+    this->new_rear_features_data_ = false;
+    std::vector<FeatureInfo>().swap(this->rear_features_);
+    this->rear_features_.clear();
+    // ROS_INFO_STREAM("Rear features size " << (int)this->rear_features_.size());
   }
 
   //std::cout << msg->data << std::endl;
   //unlock previously blocked shared variables
   //this->alg_.unlock();
-  this->front_features_mutex_exit();
+  this->rear_features_mutex_exit();
 }
 
 void AdcLandmarksSlamSolverAlgNode::rear_features_mutex_enter(void)
@@ -1229,6 +1269,7 @@ void AdcLandmarksSlamSolverAlgNode::rear_features_mutex_exit(void)
 void AdcLandmarksSlamSolverAlgNode::node_config_update(Config &config, uint32_t level)
 {
   this->alg_.lock();
+  this->rear_features_mutex_enter();
   this->front_features_mutex_enter();
   if (config.load_landmarks && !this->config_.load_landmarks)
     load_landmarks();
@@ -1250,6 +1291,7 @@ void AdcLandmarksSlamSolverAlgNode::node_config_update(Config &config, uint32_t
   }
   this->config_=config;
   this->front_features_mutex_exit();
+  this->rear_features_mutex_exit();
   this->alg_.unlock();
 }