diff --git a/include/iri_ana_nav_module/iri_ana_nav_module_bt.h b/include/iri_ana_nav_module/iri_ana_nav_module_bt.h
index 5632e84e9398f7a003295ce82dc32dbe24b207a1..997ab1c6370094d82d42dba630b6297844fdd5c3 100644
--- a/include/iri_ana_nav_module/iri_ana_nav_module_bt.h
+++ b/include/iri_ana_nav_module/iri_ana_nav_module_bt.h
@@ -531,6 +531,35 @@ class CIriAnaNavModuleBT
       *
       */
     BT::NodeStatus costmap_is_auto_clear_enabled();
+    /**
+      * \brief Enable navigation timeout
+      *
+      * This function enables the navigation timeout using as input the duration
+      * in seconds of that timeout.
+      *
+      * \return a BT:NodeStatus::SUCCESS if the input is valid.
+      *
+      */
+    BT::NodeStatus enable_timeout(BT::TreeNode& self);
+    /**
+      * \brief Disable navigation timeout
+      *
+      * This function disables the navigation timeout.
+      *
+      * \return a BT:NodeStatus::SUCCESS always.
+      *
+      */
+    BT::NodeStatus disable_timeout();
+    /**
+      * \brief Update navigation timeout
+      *
+      * This function updates the navigation timeout using as input the duration
+      * in seconds of the new timeout.
+      *
+      * \return a BT:NodeStatus::SUCCESS if the input is valid.
+      *
+      */
+    BT::NodeStatus update_timeout(BT::TreeNode& self);
 
   };
 
diff --git a/src/iri_ana_nav_module_bt.cpp b/src/iri_ana_nav_module_bt.cpp
index a923c741967cbfe2991abe48c3e967338db2cf63..1f47c6e38b3718c81897e80645162801522742a5 100644
--- a/src/iri_ana_nav_module_bt.cpp
+++ b/src/iri_ana_nav_module_bt.cpp
@@ -26,6 +26,8 @@ void CIriAnaNavModuleBT::init(IriBehaviorTreeFactory &factory)
   BT::PortsList frame_port = { BT::InputPort<std::string>("frame_id") };
   BT::PortsList current_pose_port = { BT::OutputPort<double>("current_x_nav"), BT::OutputPort<double>("current_y_nav"), BT::OutputPort<double>("current_yaw_nav") };
   BT::PortsList costmap_port = { BT::InputPort<double>("rate_hz") };
+  BT::PortsList enable_timeout_port = { BT::InputPort<double>("timeout") };
+  BT::PortsList update_timeout_port = { BT::InputPort<double>("timeout") };
 
   // detect huge variation in path
   BT::PortsList path_distance_port = { BT::OutputPort<double>("path_distance") };
@@ -60,6 +62,10 @@ void CIriAnaNavModuleBT::init(IriBehaviorTreeFactory &factory)
   factory.registerSimpleAction("costmaps_enable_auto_clear_nav_3d",  std::bind(&CIriAnaNavModuleBT::costmaps_enable_auto_clear, this, std::placeholders::_1), costmap_port);
   factory.registerSimpleAction("costmaps_disable_auto_clear_nav_3d",  std::bind(&CIriAnaNavModuleBT::costmaps_disable_auto_clear, this));
   factory.registerSimpleAction("reset_goal_variables_nav_3d",  std::bind(&CIriAnaNavModuleBT::reset_goal_variables, this));
+  factory.registerSimpleAction("enable_timeout_nav_3d",  std::bind(&CIriAnaNavModuleBT::enable_timeout, this, std::placeholders::_1), enable_timeout_port);
+  factory.registerSimpleAction("disable_timeout_nav_3d",  std::bind(&CIriAnaNavModuleBT::disable_timeout, this));
+  factory.registerSimpleAction("update_timeout_nav_3d",  std::bind(&CIriAnaNavModuleBT::update_timeout, this, std::placeholders::_1), update_timeout_port);
+
   // detect huge variation in path
   factory.registerSimpleAction("get_current_path_distance_nav_3d",  std::bind(&CIriAnaNavModuleBT::get_current_path_distance, this, std::placeholders::_1), path_distance_port);
   factory.registerSimpleAction("get_current_velocity_nav_3d",  std::bind(&CIriAnaNavModuleBT::get_current_velocity, this, std::placeholders::_1), velocity_port);
@@ -406,6 +412,44 @@ BT::NodeStatus CIriAnaNavModuleBT::reset_goal_variables()
   return BT::NodeStatus::SUCCESS;
 }
 
+BT::NodeStatus CIriAnaNavModuleBT::enable_timeout(BT::TreeNode& self)
+{
+  BT::Optional<double> timeout_input = self.getInput<double>("timeout");
+
+  if (!timeout_input)
+  {
+    ROS_ERROR("CIriAnaNavModuleBT:enable_timeout Incorrect or missing required input [timeout]");
+    return BT::NodeStatus::FAILURE;
+  }
+
+  double timeout_desired = timeout_input.value();
+  this->nav.enable_timeout(timeout_desired);
+
+  return BT::NodeStatus::SUCCESS;
+}
+
+BT::NodeStatus CIriAnaNavModuleBT::disable_timeout()
+{
+  this->nav.disable_timeout();
+  return BT::NodeStatus::SUCCESS;
+}
+
+BT::NodeStatus CIriAnaNavModuleBT::update_timeout(BT::TreeNode& self)
+{
+  BT::Optional<double> timeout_input = self.getInput<double>("timeout");
+
+  if (!timeout_input)
+  {
+    ROS_ERROR("CIriAnaNavModuleBT:update_timeout Incorrect or missing required input [timeout]");
+    return BT::NodeStatus::FAILURE;
+  }
+
+  double timeout_new = timeout_input.value();
+  this->nav.update_timeout(timeout_new);
+
+  return BT::NodeStatus::SUCCESS;
+}
+
 BT::NodeStatus CIriAnaNavModuleBT::get_current_path_distance(BT::TreeNode& self)
 {
   ROS_DEBUG("CIriAnaNavModuleBT:get_current_path_distance");
@@ -704,7 +748,6 @@ BT::NodeStatus CIriAnaNavModuleBT::set_goal_frame(BT::TreeNode& self)
   ROS_INFO("CIriAnaNavModuleBT:set_goal_frame");
   BT::Optional<std::string> frame_id_input = self.getInput<std::string>("frame_id");
 
-
   if (!frame_id_input)
   {
     ROS_ERROR("CIriAnaNavModuleBT:set_goal_frame Incorrect or missing required input [frame_id]");