diff --git a/nav2_dwb_controller/costmap_queue/package.xml b/nav2_dwb_controller/costmap_queue/package.xml
index 8a969af34e75f90dc26d8a39338ba5448c273777..0ca353ea5fd32606ca8e0fb78b1bbcc6cb5b6905 100644
--- a/nav2_dwb_controller/costmap_queue/package.xml
+++ b/nav2_dwb_controller/costmap_queue/package.xml
@@ -3,13 +3,12 @@
   <name>costmap_queue</name>
   <version>0.1.5</version>
   <description>The costmap_queue package</description>
-
   <maintainer email="davidvlu@gmail.com">David V. Lu!!</maintainer>
-
   <license>BSD</license>
 
   <buildtool_depend>ament_cmake</buildtool_depend>
   <build_depend>nav2_common</build_depend>
+
   <depend>nav2_costmap_2d</depend>
   <depend>rclcpp</depend>
 
diff --git a/nav2_dwb_controller/dwb_controller/CMakeLists.txt b/nav2_dwb_controller/dwb_controller/CMakeLists.txt
index 3a0a339cb5aa5a97e4a58e44a83ca4f997a0d8bb..bcc4f3336c338650cddfbdb00a5d14b8fd821c79 100644
--- a/nav2_dwb_controller/dwb_controller/CMakeLists.txt
+++ b/nav2_dwb_controller/dwb_controller/CMakeLists.txt
@@ -12,6 +12,7 @@ find_package(nav2_msgs REQUIRED)
 find_package(dwb_core REQUIRED)
 find_package(nav_2d_utils REQUIRED)
 find_package(nav_2d_msgs REQUIRED)
+find_package(nav2_lifecycle REQUIRED)
 
 nav2_package()
 
@@ -42,6 +43,7 @@ set(dependencies
   nav_2d_utils
   nav_2d_msgs
   nav2_util
+  nav2_lifecycle
 )
 
 ament_target_dependencies(${library_name}
@@ -51,6 +53,7 @@ ament_target_dependencies(${library_name}
 ament_target_dependencies(${executable_name}
   ${dependencies}
 )
+
 target_link_libraries(${executable_name} ${library_name})
 
 install(TARGETS ${executable_name} ${library_name}
diff --git a/nav2_dwb_controller/dwb_controller/include/dwb_controller/dwb_controller.hpp b/nav2_dwb_controller/dwb_controller/include/dwb_controller/dwb_controller.hpp
index 96a27058cf01dacc1625d21a7cfba5c660c5fff1..48d511a93381329eac5974e8a37fe8a6376bea57 100644
--- a/nav2_dwb_controller/dwb_controller/include/dwb_controller/dwb_controller.hpp
+++ b/nav2_dwb_controller/dwb_controller/include/dwb_controller/dwb_controller.hpp
@@ -17,36 +17,50 @@
 
 #include <memory>
 #include <string>
-#include "nav2_tasks/follow_path_task.hpp"
-#include "dwb_core/dwb_core.hpp"
+#include <thread>
+
 #include "dwb_core/common_types.hpp"
+#include "dwb_core/dwb_local_planner.hpp"
 #include "nav_2d_msgs/msg/pose2_d_stamped.hpp"
 #include "nav_2d_utils/odom_subscriber.hpp"
+#include "nav2_lifecycle/lifecycle_node.hpp"
+#include "nav2_tasks/follow_path_task.hpp"
 
 namespace dwb_controller
 {
 
-class DwbController : public rclcpp::Node
+class DwbController : public nav2_lifecycle::LifecycleNode
 {
 public:
-  explicit DwbController(rclcpp::executor::Executor & executor);
+  DwbController();
   ~DwbController();
 
+protected:
+  nav2_lifecycle::CallbackReturn on_configure(const rclcpp_lifecycle::State & state) override;
+  nav2_lifecycle::CallbackReturn on_activate(const rclcpp_lifecycle::State & state) override;
+  nav2_lifecycle::CallbackReturn on_deactivate(const rclcpp_lifecycle::State & state) override;
+  nav2_lifecycle::CallbackReturn on_cleanup(const rclcpp_lifecycle::State & state) override;
+  nav2_lifecycle::CallbackReturn on_shutdown(const rclcpp_lifecycle::State & state) override;
+  nav2_lifecycle::CallbackReturn on_error(const rclcpp_lifecycle::State & state) override;
+
+  // This module is a task server that implements the FollowPath task
+  std::unique_ptr<nav2_tasks::FollowPathTaskServer> task_server_;
   nav2_tasks::TaskStatus followPath(const nav2_tasks::FollowPathCommand::SharedPtr path);
 
-protected:
   bool isGoalReached(const nav_2d_msgs::msg::Pose2DStamped & pose2d);
   void publishVelocity(const nav_2d_msgs::msg::Twist2DStamped & velocity);
   void publishZeroVelocity();
   bool getRobotPose(nav_2d_msgs::msg::Pose2DStamped & pose2d);
 
-  std::unique_ptr<nav2_tasks::FollowPathTaskServer> task_server_;
-  dwb_core::CostmapROSPtr cm_;
-  dwb_core::DWBLocalPlanner planner_;
+  // It uses a costmap node
+  dwb_core::CostmapROSPtr costmap_ros_;
+  std::unique_ptr<std::thread> costmap_thread_;
+
+  // Publishers and subscribers
   std::shared_ptr<nav_2d_utils::OdomSubscriber> odom_sub_;
-  std::shared_ptr<rclcpp::Publisher<geometry_msgs::msg::Twist>> vel_pub_;
-  tf2_ros::Buffer tfBuffer_;
-  tf2_ros::TransformListener tfListener_;
+  rclcpp_lifecycle::LifecyclePublisher<geometry_msgs::msg::Twist>::SharedPtr vel_pub_;
+
+  std::unique_ptr<dwb_core::DWBLocalPlanner> planner_;
 };
 
 }  // namespace dwb_controller
diff --git a/nav2_dwb_controller/dwb_controller/package.xml b/nav2_dwb_controller/dwb_controller/package.xml
index c0038057ed09346c5568b4ceb16d4e623590ef6f..b7a8f2041a35753e7c3799d686ba24eb7f9607ad 100644
--- a/nav2_dwb_controller/dwb_controller/package.xml
+++ b/nav2_dwb_controller/dwb_controller/package.xml
@@ -16,6 +16,7 @@
   <depend>nav2_util</depend>
   <depend>nav2_robot</depend>
   <depend>nav2_msgs</depend>
+  <depend>nav2_lifecycle</depend>
   <depend>dwb_core</depend>
   <depend>nav_2d_utils</depend>
   <depend>nav_2d_msgs</depend>
diff --git a/nav2_dwb_controller/dwb_controller/src/dwb_controller.cpp b/nav2_dwb_controller/dwb_controller/src/dwb_controller.cpp
index a4a4930099d4a9f5dfc3d5f4537e16401ec9eedc..133343f9e1642a98a60f1000d9331317ab0752e3 100644
--- a/nav2_dwb_controller/dwb_controller/src/dwb_controller.cpp
+++ b/nav2_dwb_controller/dwb_controller/src/dwb_controller.cpp
@@ -13,48 +13,120 @@
 // limitations under the License.
 
 #include "dwb_controller/dwb_controller.hpp"
-#include <string>
+
 #include <chrono>
 #include <memory>
+#include <string>
+
 #include "dwb_core/exceptions.hpp"
 #include "nav_2d_utils/conversions.hpp"
 #include "nav2_util/node_utils.hpp"
 #include "dwb_controller/progress_checker.hpp"
 
 using namespace std::chrono_literals;
-using std::shared_ptr;
 using nav2_tasks::TaskStatus;
-using dwb_core::DWBLocalPlanner;
-using dwb_core::CostmapROSPtr;
 
-#define NO_OP_DELETER [] (auto) {}
+namespace nav2_dwb_controller
+{
+
+DwbController::DwbController()
+: LifecycleNode("dwb_controller")
+{
+  RCLCPP_INFO(get_logger(), "Creating");
+
+  costmap_ros_ = std::make_shared<nav2_costmap_2d::Costmap2DROS>("dwb_controller_local_costmap");
+  costmap_thread_ = std::make_unique<std::thread>(
+    [](rclcpp_lifecycle::LifecycleNode::SharedPtr node)
+    {rclcpp::spin(node->get_node_base_interface());}, costmap_ros_);
+}
 
-namespace dwb_controller
+DwbController::~DwbController()
 {
+  RCLCPP_INFO(get_logger(), "Destroying");
+  costmap_thread_->join();
+}
 
-DwbController::DwbController(rclcpp::executor::Executor & executor)
-: Node("DwbController", nav2_util::get_node_options_default()),
-  tfBuffer_(get_clock()),
-  tfListener_(tfBuffer_)
+nav2_lifecycle::CallbackReturn
+DwbController::on_configure(const rclcpp_lifecycle::State & state)
 {
-  auto temp_node = std::shared_ptr<rclcpp::Node>(this, [](auto) {});
+  RCLCPP_INFO(get_logger(), "Configuring");
 
-  cm_ = std::make_shared<nav2_costmap_2d::Costmap2DROS>("local_costmap", tfBuffer_);
-  executor.add_node(cm_);
-  odom_sub_ = std::make_shared<nav_2d_utils::OdomSubscriber>(*this);
-  vel_pub_ =
-    this->create_publisher<geometry_msgs::msg::Twist>("/cmd_vel", 1);
+  costmap_ros_->on_configure(state);
 
-  auto nh = shared_from_this();
-  planner_.initialize(nh, shared_ptr<tf2_ros::Buffer>(&tfBuffer_, NO_OP_DELETER), cm_);
+  auto node = shared_from_this();
 
-  task_server_ = std::make_unique<nav2_tasks::FollowPathTaskServer>(temp_node);
+  planner_ = std::make_unique<dwb_core::DWBLocalPlanner>(
+    node, costmap_ros_->getTfBuffer(), costmap_ros_);
+  planner_->on_configure(state);
+
+  odom_sub_ = std::make_shared<nav_2d_utils::OdomSubscriber>(*this);
+  vel_pub_ = create_publisher<geometry_msgs::msg::Twist>("/cmd_vel", 1);
+
+  task_server_ = std::make_unique<nav2_tasks::FollowPathTaskServer>(node);
+  task_server_->on_configure(state);
   task_server_->setExecuteCallback(
     std::bind(&DwbController::followPath, this, std::placeholders::_1));
+
+  return nav2_lifecycle::CallbackReturn::SUCCESS;
 }
 
-DwbController::~DwbController()
+nav2_lifecycle::CallbackReturn
+DwbController::on_activate(const rclcpp_lifecycle::State & state)
+{
+  RCLCPP_INFO(get_logger(), "Activating");
+
+  planner_->on_activate(state);
+  costmap_ros_->on_activate(state);
+  vel_pub_->on_activate();
+  task_server_->on_activate(state);
+
+  return nav2_lifecycle::CallbackReturn::SUCCESS;
+}
+
+nav2_lifecycle::CallbackReturn
+DwbController::on_deactivate(const rclcpp_lifecycle::State & state)
+{
+  RCLCPP_INFO(get_logger(), "Deactivating");
+
+  planner_->on_deactivate(state);
+  costmap_ros_->on_deactivate(state);
+  vel_pub_->on_deactivate();
+  task_server_->on_deactivate(state);
+
+  return nav2_lifecycle::CallbackReturn::SUCCESS;
+}
+
+nav2_lifecycle::CallbackReturn
+DwbController::on_cleanup(const rclcpp_lifecycle::State & state)
+{
+  RCLCPP_INFO(get_logger(), "Cleaning up");
+
+  // Cleanup the helper classes
+  planner_->on_cleanup(state);
+  costmap_ros_->on_cleanup(state);
+  task_server_->on_cleanup(state);
+
+  // Release any allocated resources
+  planner_.reset();
+  odom_sub_.reset();
+  vel_pub_.reset();
+  task_server_.reset();
+
+  return nav2_lifecycle::CallbackReturn::SUCCESS;
+}
+
+nav2_lifecycle::CallbackReturn
+DwbController::on_error(const rclcpp_lifecycle::State &)
+{
+  RCLCPP_ERROR(get_logger(), "Handling error state");
+  return nav2_lifecycle::CallbackReturn::SUCCESS;
+}
+
+nav2_lifecycle::CallbackReturn
+DwbController::on_shutdown(const rclcpp_lifecycle::State &)
 {
+  RCLCPP_INFO(get_logger(), "Shutting down");
+  return nav2_lifecycle::CallbackReturn::SUCCESS;
 }
 
 TaskStatus
@@ -64,7 +136,7 @@ DwbController::followPath(const nav2_tasks::FollowPathCommand::SharedPtr command
   try {
     auto path = nav_2d_utils::pathToPath2D(*command);
 
-    planner_.setPlan(path);
+    planner_->setPlan(path);
     RCLCPP_INFO(get_logger(), "Initialized");
 
     ProgressChecker progress_checker(std::shared_ptr<rclcpp::Node>(this, [](auto) {}));
@@ -80,7 +152,7 @@ DwbController::followPath(const nav2_tasks::FollowPathCommand::SharedPtr command
         }
         progress_checker.check(pose2d);
         auto velocity = odom_sub_->getTwist();
-        auto cmd_vel_2d = planner_.computeVelocityCommands(pose2d, velocity);
+        auto cmd_vel_2d = planner_->computeVelocityCommands(pose2d, velocity);
         publishVelocity(cmd_vel_2d);
         RCLCPP_INFO(get_logger(), "Publishing velocity at time %.2f", now().seconds());
 
@@ -101,7 +173,7 @@ DwbController::followPath(const nav2_tasks::FollowPathCommand::SharedPtr command
 
           // and pass it to the local planner
           auto path = nav_2d_utils::pathToPath2D(*path_cmd);
-          planner_.setPlan(path);
+          planner_->setPlan(path);
         }
       }
       loop_rate.sleep();
@@ -137,13 +209,13 @@ void DwbController::publishZeroVelocity()
 bool DwbController::isGoalReached(const nav_2d_msgs::msg::Pose2DStamped & pose2d)
 {
   nav_2d_msgs::msg::Twist2D velocity = odom_sub_->getTwist();
-  return planner_.isGoalReached(pose2d, velocity);
+  return planner_->isGoalReached(pose2d, velocity);
 }
 
 bool DwbController::getRobotPose(nav_2d_msgs::msg::Pose2DStamped & pose2d)
 {
   geometry_msgs::msg::PoseStamped current_pose;
-  if (!cm_->getRobotPose(current_pose)) {
+  if (!costmap_ros_->getRobotPose(current_pose)) {
     RCLCPP_ERROR(this->get_logger(), "Could not get robot pose");
     return false;
   }
@@ -151,4 +223,4 @@ bool DwbController::getRobotPose(nav_2d_msgs::msg::Pose2DStamped & pose2d)
   return true;
 }
 
-}  // namespace dwb_controller
+}  // namespace nav2_dwb_controller
diff --git a/nav2_dwb_controller/dwb_controller/src/main.cpp b/nav2_dwb_controller/dwb_controller/src/main.cpp
index 4b2f8958e40877de8003836ff4b78518998391c1..c24c2858d705081121f77933d0594e7f0872205d 100644
--- a/nav2_dwb_controller/dwb_controller/src/main.cpp
+++ b/nav2_dwb_controller/dwb_controller/src/main.cpp
@@ -19,10 +19,8 @@
 int main(int argc, char ** argv)
 {
   rclcpp::init(argc, argv);
-  rclcpp::executors::SingleThreadedExecutor exec;
-  auto controller_node = std::make_shared<dwb_controller::DwbController>(exec);
-  exec.add_node(controller_node);
-  exec.spin();
+  auto node = std::make_shared<nav2_dwb_controller::DwbController>();
+  rclcpp::spin(node->get_node_base_interface());
   rclcpp::shutdown();
 
   return 0;
diff --git a/nav2_dwb_controller/dwb_core/CMakeLists.txt b/nav2_dwb_controller/dwb_core/CMakeLists.txt
index 87f666ff54e6b0dbf0fb4a3df065b70fc85175b4..de785fe6856aee68e7308725463968f36f4d7378 100644
--- a/nav2_dwb_controller/dwb_core/CMakeLists.txt
+++ b/nav2_dwb_controller/dwb_core/CMakeLists.txt
@@ -15,6 +15,7 @@ find_package(visualization_msgs REQUIRED)
 find_package(nav_2d_utils REQUIRED)
 find_package(nav_msgs REQUIRED)
 find_package(tf2_ros REQUIRED)
+find_package(nav2_lifecycle REQUIRED)
 
 nav2_package()
 
@@ -35,10 +36,11 @@ set(dependencies
   nav_2d_utils
   nav_msgs
   tf2_ros
+  nav2_lifecycle
 )
 
 add_library(dwb_core SHARED
-  src/dwb_core.cpp
+  src/dwb_local_planner.cpp
   src/publisher.cpp
   src/illegal_trajectory_tracker.cpp
 )
diff --git a/nav2_dwb_controller/dwb_core/include/dwb_core/dwb_core.hpp b/nav2_dwb_controller/dwb_core/include/dwb_core/dwb_local_planner.hpp
similarity index 89%
rename from nav2_dwb_controller/dwb_core/include/dwb_core/dwb_core.hpp
rename to nav2_dwb_controller/dwb_core/include/dwb_core/dwb_local_planner.hpp
index 832993f6755291da6f33b4248f275769a8c1d58f..bc676eb58119daf4d04fd2f7f56b637914cf83fe 100644
--- a/nav2_dwb_controller/dwb_core/include/dwb_core/dwb_core.hpp
+++ b/nav2_dwb_controller/dwb_core/include/dwb_core/dwb_local_planner.hpp
@@ -32,19 +32,21 @@
  *  POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef DWB_CORE__DWB_CORE_HPP_
-#define DWB_CORE__DWB_CORE_HPP_
+#ifndef DWB_CORE__DWB_LOCAL_PLANNER_HPP_
+#define DWB_CORE__DWB_LOCAL_PLANNER_HPP_
 
+#include <memory>
 #include <string>
 #include <vector>
-#include <memory>
-#include "pluginlib/class_loader.hpp"
-#include "nav_2d_msgs/msg/twist2_d_stamped.hpp"
-#include "nav_2d_msgs/msg/pose2_d_stamped.hpp"
-#include "dwb_core/trajectory_generator.hpp"
+
 #include "dwb_core/goal_checker.hpp"
-#include "dwb_core/trajectory_critic.hpp"
 #include "dwb_core/publisher.hpp"
+#include "dwb_core/trajectory_critic.hpp"
+#include "dwb_core/trajectory_generator.hpp"
+#include "nav_2d_msgs/msg/pose2_d_stamped.hpp"
+#include "nav_2d_msgs/msg/twist2_d_stamped.hpp"
+#include "nav2_lifecycle/lifecycle_node.hpp"
+#include "pluginlib/class_loader.hpp"
 
 namespace dwb_core
 {
@@ -53,25 +55,21 @@ namespace dwb_core
  * @class DWBLocalPlanner
  * @brief Plugin-based flexible local_planner
  */
-class DWBLocalPlanner
+class DWBLocalPlanner : public nav2_lifecycle::LifecycleHelperInterface
 {
 public:
   /**
    * @brief Constructor that brings up pluginlib loaders
    */
-  DWBLocalPlanner();
+  DWBLocalPlanner(
+    nav2_lifecycle::LifecycleNode::SharedPtr node, TFBufferPtr tf, CostmapROSPtr costmap_ros);
 
   virtual ~DWBLocalPlanner() {}
 
-  /**
-   * @brief nav_core2 initialization
-   * @param name Namespace for this planner
-   * @param tf TFListener pointer
-   * @param costmap_ros Costmap pointer
-   */
-  void initialize(
-    std::shared_ptr<rclcpp::Node> & private_nh, TFBufferPtr tf,
-    CostmapROSPtr costmap_ros);
+  nav2_lifecycle::CallbackReturn on_configure(const rclcpp_lifecycle::State & state) override;
+  nav2_lifecycle::CallbackReturn on_activate(const rclcpp_lifecycle::State & state) override;
+  nav2_lifecycle::CallbackReturn on_deactivate(const rclcpp_lifecycle::State & state) override;
+  nav2_lifecycle::CallbackReturn on_cleanup(const rclcpp_lifecycle::State & state) override;
 
   /**
    * @brief nav_core2 setPlan - Sets the global plan
@@ -123,6 +121,7 @@ public:
   dwb_msgs::msg::TrajectoryScore scoreTrajectory(
     const dwb_msgs::msg::Trajectory2D & traj,
     double best_score = -1);
+
   /**
    * @brief Compute the best command given the current pose and velocity, with possible debug information
    *
@@ -176,14 +175,6 @@ protected:
   double prune_distance_;
   bool debug_trajectory_details_;
 
-  // Plugin handling
-  pluginlib::ClassLoader<TrajectoryGenerator> traj_gen_loader_;
-  TrajectoryGenerator::Ptr traj_generator_;
-  pluginlib::ClassLoader<GoalChecker> goal_checker_loader_;
-  GoalChecker::Ptr goal_checker_;
-  pluginlib::ClassLoader<TrajectoryCritic> critic_loader_;
-  std::vector<TrajectoryCritic::Ptr> critics_;
-
   /**
    * @brief try to resolve a possibly shortened critic name with the default namespaces and the suffix "Critic"
    *
@@ -198,14 +189,26 @@ protected:
    */
   void loadCritics();
 
-  std::vector<std::string> default_critic_namespaces_;
+  void loadBackwardsCompatibleParameters();
 
-  CostmapROSPtr costmap_ros_;
+  nav2_lifecycle::LifecycleNode::SharedPtr node_;
   TFBufferPtr tf_;
-  DWBPublisher pub_;
-  std::shared_ptr<rclcpp::Node> nh_;
+  CostmapROSPtr costmap_ros_;
+
+  std::unique_ptr<DWBPublisher> pub_;
+  std::vector<std::string> default_critic_namespaces_;
+
+  // Plugin handling
+  pluginlib::ClassLoader<TrajectoryGenerator> traj_gen_loader_;
+  TrajectoryGenerator::Ptr traj_generator_;
+
+  pluginlib::ClassLoader<GoalChecker> goal_checker_loader_;
+  GoalChecker::Ptr goal_checker_;
+
+  pluginlib::ClassLoader<TrajectoryCritic> critic_loader_;
+  std::vector<TrajectoryCritic::Ptr> critics_;
 };
 
 }  // namespace dwb_core
 
-#endif  // DWB_CORE__DWB_CORE_HPP_
+#endif  // DWB_CORE__DWB_LOCAL_PLANNER_HPP_
diff --git a/nav2_dwb_controller/dwb_core/include/dwb_core/goal_checker.hpp b/nav2_dwb_controller/dwb_core/include/dwb_core/goal_checker.hpp
index b483052b3c74941d4f4a2b65a230e7450fc9376d..efec1c57f32ba55196f11e1a2b6493b0a42c32aa 100644
--- a/nav2_dwb_controller/dwb_core/include/dwb_core/goal_checker.hpp
+++ b/nav2_dwb_controller/dwb_core/include/dwb_core/goal_checker.hpp
@@ -36,9 +36,11 @@
 #define DWB_CORE__GOAL_CHECKER_HPP_
 
 #include <memory>
+
 #include "rclcpp/rclcpp.hpp"
 #include "geometry_msgs/msg/pose2_d.hpp"
 #include "nav_2d_msgs/msg/twist2_d.hpp"
+#include "nav2_lifecycle/lifecycle_node.hpp"
 
 namespace dwb_core
 {
@@ -63,7 +65,7 @@ public:
    * @brief Initialize any parameters from the NodeHandle
    * @param nh NodeHandle for grabbing parameters
    */
-  virtual void initialize(const std::shared_ptr<rclcpp::Node> & nh) = 0;
+  virtual void initialize(const nav2_lifecycle::LifecycleNode::SharedPtr & nh) = 0;
 
   /**
    * @brief Check whether the goal should be considered reached
diff --git a/nav2_dwb_controller/dwb_core/include/dwb_core/publisher.hpp b/nav2_dwb_controller/dwb_core/include/dwb_core/publisher.hpp
index 4abd7fdc57e5809d8788111e16d9671e89b15f6a..453c9e1e0ca2fa771abdc81c9580375d0f044153 100644
--- a/nav2_dwb_controller/dwb_core/include/dwb_core/publisher.hpp
+++ b/nav2_dwb_controller/dwb_core/include/dwb_core/publisher.hpp
@@ -35,16 +35,21 @@
 #ifndef DWB_CORE__PUBLISHER_HPP_
 #define DWB_CORE__PUBLISHER_HPP_
 
-#include <vector>
 #include <memory>
 #include <string>
-#include "rclcpp/rclcpp.hpp"
+#include <vector>
+
 #include "dwb_core/common_types.hpp"
 #include "dwb_core/trajectory_critic.hpp"
 #include "dwb_msgs/msg/local_plan_evaluation.hpp"
+#include "nav2_lifecycle/lifecycle_helper_interface.hpp"
 #include "nav_msgs/msg/path.hpp"
-#include "visualization_msgs/msg/marker_array.hpp"
+#include "rclcpp/rclcpp.hpp"
 #include "sensor_msgs/msg/point_cloud2.hpp"
+#include "visualization_msgs/msg/marker_array.hpp"
+#include "nav2_lifecycle/lifecycle_node.hpp"
+
+using rclcpp_lifecycle::LifecyclePublisher;
 
 namespace dwb_core
 {
@@ -61,14 +66,15 @@ namespace dwb_core
  *   5) Markers representing the different trajectories evaluated
  *   6) The CostGrid (in the form of a complex PointCloud2)
  */
-class DWBPublisher
+class DWBPublisher : public nav2_lifecycle::LifecycleHelperInterface
 {
 public:
-  /**
-   * @brief Load the parameters and advertise topics as needed
-   * @param nh NodeHandle to load parameters from
-   */
-  void initialize(const std::shared_ptr<rclcpp::Node> & nh);
+  explicit DWBPublisher(nav2_lifecycle::LifecycleNode::SharedPtr node);
+
+  nav2_lifecycle::CallbackReturn on_configure(const rclcpp_lifecycle::State & state) override;
+  nav2_lifecycle::CallbackReturn on_activate(const rclcpp_lifecycle::State & state) override;
+  nav2_lifecycle::CallbackReturn on_deactivate(const rclcpp_lifecycle::State & state) override;
+  nav2_lifecycle::CallbackReturn on_cleanup(const rclcpp_lifecycle::State & state) override;
 
   /**
    * @brief Does the publisher require that the LocalPlanEvaluation be saved
@@ -105,22 +111,25 @@ protected:
     rclcpp::Publisher<nav_msgs::msg::Path> & pub, bool flag);
 
   // Flags for turning on/off publishing specific components
-  bool publish_evaluation_, publish_global_plan_, publish_transformed_, publish_local_plan_,
-    publish_trajectories_;
+  bool publish_evaluation_;
+  bool publish_global_plan_;
+  bool publish_transformed_;
+  bool publish_local_plan_;
+  bool publish_trajectories_;
   bool publish_cost_grid_pc_;
 
   // Previously published marker count for removing markers as needed
-  unsigned prev_marker_count_;
+  unsigned int prev_marker_count_;
 
   // Publisher Objects
-  std::shared_ptr<rclcpp::Publisher<dwb_msgs::msg::LocalPlanEvaluation>> eval_pub_;
-  std::shared_ptr<rclcpp::Publisher<nav_msgs::msg::Path>> global_pub_;
-  std::shared_ptr<rclcpp::Publisher<nav_msgs::msg::Path>> transformed_pub_;
-  std::shared_ptr<rclcpp::Publisher<nav_msgs::msg::Path>> local_pub_;
-  std::shared_ptr<rclcpp::Publisher<visualization_msgs::msg::MarkerArray>> marker_pub_;
-  std::shared_ptr<rclcpp::Publisher<sensor_msgs::msg::PointCloud>> cost_grid_pc_pub_;
-
-  std::shared_ptr<rclcpp::Node> nh_;
+  std::shared_ptr<LifecyclePublisher<dwb_msgs::msg::LocalPlanEvaluation>> eval_pub_;
+  std::shared_ptr<LifecyclePublisher<nav_msgs::msg::Path>> global_pub_;
+  std::shared_ptr<LifecyclePublisher<nav_msgs::msg::Path>> transformed_pub_;
+  std::shared_ptr<LifecyclePublisher<nav_msgs::msg::Path>> local_pub_;
+  std::shared_ptr<LifecyclePublisher<visualization_msgs::msg::MarkerArray>> marker_pub_;
+  std::shared_ptr<LifecyclePublisher<sensor_msgs::msg::PointCloud>> cost_grid_pc_pub_;
+
+  nav2_lifecycle::LifecycleNode::SharedPtr node_;
 };
 
 }  // namespace dwb_core
diff --git a/nav2_dwb_controller/dwb_core/include/dwb_core/trajectory_critic.hpp b/nav2_dwb_controller/dwb_core/include/dwb_core/trajectory_critic.hpp
index 997148fb6e95f2fe96d10664c2a9e5f91fec84f5..465b5a892c519d8f5d721ad786d57bb0eb54bde0 100644
--- a/nav2_dwb_controller/dwb_core/include/dwb_core/trajectory_critic.hpp
+++ b/nav2_dwb_controller/dwb_core/include/dwb_core/trajectory_critic.hpp
@@ -38,6 +38,7 @@
 #include <string>
 #include <vector>
 #include <memory>
+
 #include "rclcpp/rclcpp.hpp"
 #include "dwb_core/common_types.hpp"
 #include "geometry_msgs/msg/pose2_d.hpp"
@@ -45,6 +46,7 @@
 #include "nav_2d_msgs/msg/path2_d.hpp"
 #include "dwb_msgs/msg/trajectory2_d.hpp"
 #include "sensor_msgs/msg/point_cloud.hpp"
+#include "nav2_lifecycle/lifecycle_node.hpp"
 
 namespace dwb_core
 {
@@ -90,7 +92,7 @@ public:
    * @param costmap_ros Pointer to the costmap
    */
   void initialize(
-    const std::shared_ptr<rclcpp::Node> & nh,
+    const nav2_lifecycle::LifecycleNode::SharedPtr & nh,
     std::string & name,
     CostmapROSPtr costmap_ros)
   {
@@ -171,7 +173,7 @@ protected:
   std::string name_;
   CostmapROSPtr costmap_ros_;
   double scale_;
-  std::shared_ptr<rclcpp::Node> nh_;
+  nav2_lifecycle::LifecycleNode::SharedPtr nh_;
 };
 
 }  // namespace dwb_core
diff --git a/nav2_dwb_controller/dwb_core/include/dwb_core/trajectory_generator.hpp b/nav2_dwb_controller/dwb_core/include/dwb_core/trajectory_generator.hpp
index ec214f400d7dde4672345c8949f02b2c239e3446..dab896402494757b2bd9054b82f253d4c7c43814 100644
--- a/nav2_dwb_controller/dwb_core/include/dwb_core/trajectory_generator.hpp
+++ b/nav2_dwb_controller/dwb_core/include/dwb_core/trajectory_generator.hpp
@@ -40,6 +40,7 @@
 #include "rclcpp/rclcpp.hpp"
 #include "nav_2d_msgs/msg/twist2_d.hpp"
 #include "dwb_msgs/msg/trajectory2_d.hpp"
+#include "nav2_lifecycle/lifecycle_node.hpp"
 
 namespace dwb_core
 {
@@ -70,7 +71,7 @@ public:
    * @brief Initialize parameters as needed
    * @param nh NodeHandle to read parameters from
    */
-  virtual void initialize(const std::shared_ptr<rclcpp::Node> & nh) = 0;
+  virtual void initialize(const nav2_lifecycle::LifecycleNode::SharedPtr & nh) = 0;
 
   /**
    * @brief Start a new iteration based on the current velocity
diff --git a/nav2_dwb_controller/dwb_core/package.xml b/nav2_dwb_controller/dwb_core/package.xml
index 4954910aaa09d7293b28c231ffc333c54c4640b2..1b3c4cda6dc18d5b84d1d6f01b689d87fcf935e8 100644
--- a/nav2_dwb_controller/dwb_core/package.xml
+++ b/nav2_dwb_controller/dwb_core/package.xml
@@ -22,6 +22,7 @@
   <build_depend>nav_2d_utils</build_depend>
   <build_depend>nav_msgs</build_depend>
   <build_depend>tf2_ros</build_depend>
+  <build_depend>nav2_lifecycle</build_depend>
 
   <exec_depend>rclcpp</exec_depend>
   <exec_depend>std_msgs</exec_depend>
@@ -34,6 +35,7 @@
   <exec_depend>pluginlib</exec_depend>
   <exec_depend>nav_msgs</exec_depend>
   <exec_depend>tf2_ros</exec_depend>
+  <exec_depend>nav2_lifecyle</exec_depend>
 
   <test_depend>ament_lint_common</test_depend>
   <test_depend>ament_lint_auto</test_depend>
diff --git a/nav2_dwb_controller/dwb_core/src/dwb_core.cpp b/nav2_dwb_controller/dwb_core/src/dwb_local_planner.cpp
similarity index 79%
rename from nav2_dwb_controller/dwb_core/src/dwb_core.cpp
rename to nav2_dwb_controller/dwb_core/src/dwb_local_planner.cpp
index b30be1b90192f42c7cb62615ee9fd9b6e1a0f985..208a700043e205605529a8a63337d1a872c36f03 100644
--- a/nav2_dwb_controller/dwb_core/src/dwb_core.cpp
+++ b/nav2_dwb_controller/dwb_core/src/dwb_local_planner.cpp
@@ -32,73 +32,41 @@
  *  POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include <string>
-#include <vector>
 #include <algorithm>
 #include <memory>
+#include <string>
 #include <utility>
-#include "dwb_core/dwb_core.hpp"
+#include <vector>
+
+#include "dwb_core/dwb_local_planner.hpp"
+#include "dwb_core/exceptions.hpp"
 #include "dwb_core/illegal_trajectory_tracker.hpp"
+#include "dwb_msgs/msg/critic_score.hpp"
+#include "nav_2d_msgs/msg/twist2_d.hpp"
 #include "nav_2d_utils/conversions.hpp"
 #include "nav_2d_utils/parameters.hpp"
 #include "nav_2d_utils/tf_help.hpp"
-#include "nav_2d_msgs/msg/twist2_d.hpp"
-#include "dwb_msgs/msg/critic_score.hpp"
+#include "nav2_lifecycle/lifecycle_node.hpp"
 #include "pluginlib/class_list_macros.hpp"
-#include "dwb_core/exceptions.hpp"
 
 namespace dwb_core
 {
 
-void loadBackwardsCompatibleParameters(const std::shared_ptr<rclcpp::Node> & nh)
-{
-  std::vector<std::string> critic_names;
-  RCLCPP_INFO(nh->get_logger(),
-    "DWBLocalPlanner", "No critics configured! Using the default set.");
-  critic_names.push_back("RotateToGoal");       // discards trajectories that move forward when
-                                                //   already at goal
-  critic_names.push_back("Oscillation");        // discards oscillating motions (assisgns cost -1)
-  critic_names.push_back("ObstacleFootprint");  // discards trajectories that move into obstacles
-  critic_names.push_back("GoalAlign");          // prefers trajectories that make the
-                                                //   nose go towards (local) nose goal
-  critic_names.push_back("PathAlign");          // prefers trajectories that keep the
-                                                //   robot nose on nose path
-  critic_names.push_back("PathDist");           // prefers trajectories on global path
-  critic_names.push_back("GoalDist");           // prefers trajectories that go towards
-                                                //   (local) goal, based on wave propagation
-  nh->set_parameters({rclcpp::Parameter("critics", critic_names)});
-  /* *INDENT-OFF* */
-  nav_2d_utils::moveParameter(nh, "path_distance_bias", "PathAlign.scale", 32.0, false);
-  nav_2d_utils::moveParameter(nh, "goal_distance_bias", "GoalAlign.scale", 24.0, false);
-  nav_2d_utils::moveParameter(nh, "path_distance_bias", "PathDist.scale", 32.0);
-  nav_2d_utils::moveParameter(nh, "goal_distance_bias", "GoalDist.scale", 24.0);
-  nav_2d_utils::moveParameter(nh, "occdist_scale",      "ObstacleFootprint.scale", 0.01);
-
-  nav_2d_utils::moveParameter(nh, "max_scaling_factor", "ObstacleFootprint.max_scaling_factor", 0.2);  // NOLINT
-  nav_2d_utils::moveParameter(nh, "scaling_speed",      "ObstacleFootprint.scaling_speed", 0.25);
-  /* *INDENT-ON* */
-}
-
-DWBLocalPlanner::DWBLocalPlanner()
-: traj_gen_loader_("dwb_core", "dwb_core::TrajectoryGenerator"),
+DWBLocalPlanner::DWBLocalPlanner(
+  nav2_lifecycle::LifecycleNode::SharedPtr node, TFBufferPtr tf,
+  CostmapROSPtr costmap_ros)
+: node_(node),
+  tf_(tf),
+  costmap_ros_(costmap_ros),
+  traj_gen_loader_("dwb_core", "dwb_core::TrajectoryGenerator"),
   goal_checker_loader_("dwb_core", "dwb_core::GoalChecker"),
   critic_loader_("dwb_core", "dwb_core::TrajectoryCritic")
 {
 }
 
-void DWBLocalPlanner::initialize(
-  std::shared_ptr<rclcpp::Node> & private_nh, TFBufferPtr tf,
-  CostmapROSPtr costmap_ros)
+nav2_lifecycle::CallbackReturn
+DWBLocalPlanner::on_configure(const rclcpp_lifecycle::State & state)
 {
-  nh_ = private_nh;
-  tf_ = tf;
-  costmap_ros_ = costmap_ros;
-  nh_->get_parameter_or("prune_plan", prune_plan_, true);
-  nh_->get_parameter_or("prune_distance", prune_distance_, 1.0);
-  nh_->get_parameter_or("debug_trajectory_details", debug_trajectory_details_, false);
-  pub_.initialize(nh_);
-
-  // Plugins
   std::string traj_generator_name;
   nh_->get_parameter_or("trajectory_generator_name", traj_generator_name,
     std::string("dwb_plugins::StandardTrajectoryGenerator"));
@@ -106,15 +74,54 @@ void DWBLocalPlanner::initialize(
   traj_generator_->initialize(nh_);
 
   std::string goal_checker_name;
-  nh_->get_parameter_or("goal_checker_name", goal_checker_name,
+  node_->get_parameter_or("prune_plan", prune_plan_, true);
+  node_->get_parameter_or("prune_distance", prune_distance_, 1.0);
+  node_->get_parameter_or("debug_trajectory_details", debug_trajectory_details_, false);
+  node_->get_parameter_or("trajectory_generator_name", traj_generator_name,
+    std::string("dwb_plugins::StandardTrajectoryGenerator"));
+  node_->get_parameter_or("goal_checker_name", goal_checker_name,
     std::string("dwb_plugins::SimpleGoalChecker"));
+
   goal_checker_ = goal_checker_loader_.createUniqueInstance(goal_checker_name);
   goal_checker_->initialize(nh_);
 
+  pub_ = std::make_unique<DWBPublisher>(node_);
+  pub_->on_configure(state);
+
   loadCritics();
+
+  return nav2_lifecycle::CallbackReturn::SUCCESS;
+}
+
+nav2_lifecycle::CallbackReturn
+DWBLocalPlanner::on_activate(const rclcpp_lifecycle::State & state)
+{
+  pub_->on_activate(state);
+
+  return nav2_lifecycle::CallbackReturn::SUCCESS;
+}
+
+nav2_lifecycle::CallbackReturn
+DWBLocalPlanner::on_deactivate(const rclcpp_lifecycle::State & state)
+{
+  pub_->on_deactivate(state);
+
+  return nav2_lifecycle::CallbackReturn::SUCCESS;
 }
 
-std::string DWBLocalPlanner::resolveCriticClassName(std::string base_name)
+nav2_lifecycle::CallbackReturn
+DWBLocalPlanner::on_cleanup(const rclcpp_lifecycle::State & state)
+{
+  pub_->on_cleanup(state);
+
+  traj_generator_.reset();
+  goal_checker_.reset();
+
+  return nav2_lifecycle::CallbackReturn::SUCCESS;
+}
+
+std::string
+DWBLocalPlanner::resolveCriticClassName(std::string base_name)
 {
   if (base_name.find("Critic") == std::string::npos) {
     base_name = base_name + "Critic";
@@ -131,34 +138,65 @@ std::string DWBLocalPlanner::resolveCriticClassName(std::string base_name)
   return base_name;
 }
 
-void DWBLocalPlanner::loadCritics()
+void
+DWBLocalPlanner::loadCritics()
 {
-  nh_->get_parameter("default_critic_namespaces", default_critic_namespaces_);
+  node_->get_parameter("default_critic_namespaces", default_critic_namespaces_);
   if (default_critic_namespaces_.size() == 0) {
     default_critic_namespaces_.push_back("dwb_critics");
   }
 
   std::vector<std::string> critic_names;
-  if (!nh_->get_parameter("critics", critic_names)) {
-    loadBackwardsCompatibleParameters(nh_);
+  if (!node_->get_parameter("critics", critic_names)) {
+    loadBackwardsCompatibleParameters();
   }
 
-  nh_->get_parameter("critics", critic_names);
+  node_->get_parameter("critics", critic_names);
   for (unsigned int i = 0; i < critic_names.size(); i++) {
     std::string plugin_name = critic_names[i];
     std::string plugin_class;
-    nh_->get_parameter_or(plugin_name + "/class", plugin_class, plugin_name);
+    node_->get_parameter_or(plugin_name + "/class", plugin_class, plugin_name);
     plugin_class = resolveCriticClassName(plugin_class);
 
     TrajectoryCritic::Ptr plugin = critic_loader_.createUniqueInstance(plugin_class);
     RCLCPP_INFO(nh_->get_logger(),
       "Using critic \"%s\" (%s)", plugin_name.c_str(), plugin_class.c_str());
     critics_.push_back(plugin);
-    plugin->initialize(nh_, plugin_name, costmap_ros_);
+    plugin->initialize(node_, plugin_name, costmap_ros_);
   }
 }
 
-bool DWBLocalPlanner::isGoalReached(
+void
+DWBLocalPlanner::loadBackwardsCompatibleParameters()
+{
+  std::vector<std::string> critic_names;
+  RCLCPP_INFO(node_->get_logger(),
+    "DWBLocalPlanner", "No critics configured! Using the default set.");
+  critic_names.push_back("RotateToGoal");       // discards trajectories that move forward when
+                                                //   already at goal
+  critic_names.push_back("Oscillation");        // discards oscillating motions (assisgns cost -1)
+  critic_names.push_back("ObstacleFootprint");  // discards trajectories that move into obstacles
+  critic_names.push_back("GoalAlign");          // prefers trajectories that make the
+                                                //   nose go towards (local) nose goal
+  critic_names.push_back("PathAlign");          // prefers trajectories that keep the
+                                                //   robot nose on nose path
+  critic_names.push_back("PathDist");           // prefers trajectories on global path
+  critic_names.push_back("GoalDist");           // prefers trajectories that go towards
+                                                //   (local) goal, based on wave propagation
+  node_->set_parameters({rclcpp::Parameter("critics", critic_names)});
+  /* *INDENT-OFF* */
+  nav_2d_utils::moveParameter(node_, "path_distance_bias", "PathAlign.scale", 32.0, false);
+  nav_2d_utils::moveParameter(node_, "goal_distance_bias", "GoalAlign.scale", 24.0, false);
+  nav_2d_utils::moveParameter(node_, "path_distance_bias", "PathDist.scale", 32.0);
+  nav_2d_utils::moveParameter(node_, "goal_distance_bias", "GoalDist.scale", 24.0);
+  nav_2d_utils::moveParameter(node_, "occdist_scale",      "ObstacleFootprint.scale", 0.01);
+  nav_2d_utils::moveParameter(node_, "max_scaling_factor", "ObstacleFootprint.max_scaling_factor", 0.2);  // NOLINT
+  nav_2d_utils::moveParameter(node_, "scaling_speed",      "ObstacleFootprint.scaling_speed", 0.25);
+  /* *INDENT-ON* */
+}
+
+bool
+DWBLocalPlanner::isGoalReached(
   const nav_2d_msgs::msg::Pose2DStamped & pose,
   const nav_2d_msgs::msg::Twist2D & velocity)
 {
@@ -177,42 +215,45 @@ bool DWBLocalPlanner::isGoalReached(
   return goal_checker_->isGoalReached(local_start_pose.pose, local_goal_pose.pose, velocity);
 }
 
-void DWBLocalPlanner::setPlan(const nav_2d_msgs::msg::Path2D & path)
+void
+DWBLocalPlanner::setPlan(const nav_2d_msgs::msg::Path2D & path)
 {
   for (TrajectoryCritic::Ptr critic : critics_) {
     critic->reset();
   }
 
-  pub_.publishGlobalPlan(path);
+  pub_->publishGlobalPlan(path);
   global_plan_ = path;
 }
 
-nav_2d_msgs::msg::Twist2DStamped DWBLocalPlanner::computeVelocityCommands(
+nav_2d_msgs::msg::Twist2DStamped
+DWBLocalPlanner::computeVelocityCommands(
   const nav_2d_msgs::msg::Pose2DStamped & pose,
   const nav_2d_msgs::msg::Twist2D & velocity)
 {
   std::shared_ptr<dwb_msgs::msg::LocalPlanEvaluation> results = nullptr;
-  if (pub_.shouldRecordEvaluation()) {
+  if (pub_->shouldRecordEvaluation()) {
     results = std::make_shared<dwb_msgs::msg::LocalPlanEvaluation>();
   }
 
   try {
     nav_2d_msgs::msg::Twist2DStamped cmd_vel = computeVelocityCommands(pose, velocity, results);
-    pub_.publishEvaluation(results);
+    pub_->publishEvaluation(results);
     return cmd_vel;
   } catch (const nav_core2::PlannerException & e) {
-    pub_.publishEvaluation(results);
+    pub_->publishEvaluation(results);
     throw;
   }
 }
 
-void DWBLocalPlanner::prepareGlobalPlan(
+void
+DWBLocalPlanner::prepareGlobalPlan(
   const nav_2d_msgs::msg::Pose2DStamped & pose, nav_2d_msgs::msg::Path2D & transformed_plan,
   nav_2d_msgs::msg::Pose2DStamped & goal_pose, bool publish_plan)
 {
   transformed_plan = transformGlobalPlan(pose);
   if (publish_plan) {
-    pub_.publishTransformedPlan(transformed_plan);
+    pub_->publishTransformedPlan(transformed_plan);
   }
 
   goal_pose.header.frame_id = global_plan_.header.frame_id;
@@ -220,14 +261,15 @@ void DWBLocalPlanner::prepareGlobalPlan(
   nav_2d_utils::transformPose(tf_, costmap_ros_->getGlobalFrameID(), goal_pose, goal_pose);
 }
 
-nav_2d_msgs::msg::Twist2DStamped DWBLocalPlanner::computeVelocityCommands(
+nav_2d_msgs::msg::Twist2DStamped
+DWBLocalPlanner::computeVelocityCommands(
   const nav_2d_msgs::msg::Pose2DStamped & pose,
   const nav_2d_msgs::msg::Twist2D & velocity,
   std::shared_ptr<dwb_msgs::msg::LocalPlanEvaluation> & results)
 {
   if (results) {
     results->header.frame_id = pose.header.frame_id;
-    results->header.stamp = nh_->now();
+    results->header.stamp = node_->now();
   }
 
   nav_2d_msgs::msg::Path2D transformed_plan;
@@ -246,7 +288,7 @@ nav_2d_msgs::msg::Twist2DStamped DWBLocalPlanner::computeVelocityCommands(
 
     // Return Value
     nav_2d_msgs::msg::Twist2DStamped cmd_vel;
-    cmd_vel.header.stamp = nh_->now();
+    cmd_vel.header.stamp = node_->now();
     cmd_vel.velocity = best.traj.velocity;
 
     // debrief stateful scoring functions
@@ -254,8 +296,8 @@ nav_2d_msgs::msg::Twist2DStamped DWBLocalPlanner::computeVelocityCommands(
       critic->debrief(cmd_vel.velocity);
     }
 
-    pub_.publishLocalPlan(pose.header, best.traj);
-    pub_.publishCostGrid(costmap_ros_, critics_);
+    pub_->publishLocalPlan(pose.header, best.traj);
+    pub_->publishCostGrid(costmap_ros_, critics_);
 
     return cmd_vel;
   } catch (const nav_core2::NoLegalTrajectoriesException & e) {
@@ -265,14 +307,15 @@ nav_2d_msgs::msg::Twist2DStamped DWBLocalPlanner::computeVelocityCommands(
     for (TrajectoryCritic::Ptr critic : critics_) {
       critic->debrief(empty_cmd);
     }
-    pub_.publishLocalPlan(pose.header, empty_traj);
-    pub_.publishCostGrid(costmap_ros_, critics_);
+    pub_->publishLocalPlan(pose.header, empty_traj);
+    pub_->publishCostGrid(costmap_ros_, critics_);
 
     throw;
   }
 }
 
-dwb_msgs::msg::TrajectoryScore DWBLocalPlanner::coreScoringAlgorithm(
+dwb_msgs::msg::TrajectoryScore
+DWBLocalPlanner::coreScoringAlgorithm(
   const geometry_msgs::msg::Pose2D & pose,
   const nav_2d_msgs::msg::Twist2D velocity,
   std::shared_ptr<dwb_msgs::msg::LocalPlanEvaluation> & results)
@@ -338,7 +381,8 @@ dwb_msgs::msg::TrajectoryScore DWBLocalPlanner::coreScoringAlgorithm(
   return best;
 }
 
-dwb_msgs::msg::TrajectoryScore DWBLocalPlanner::scoreTrajectory(
+dwb_msgs::msg::TrajectoryScore
+DWBLocalPlanner::scoreTrajectory(
   const dwb_msgs::msg::Trajectory2D & traj,
   double best_score)
 {
@@ -368,16 +412,19 @@ dwb_msgs::msg::TrajectoryScore DWBLocalPlanner::scoreTrajectory(
   return score;
 }
 
-double getSquareDistance(
+double
+getSquareDistance(
   const geometry_msgs::msg::Pose2D & pose_a,
   const geometry_msgs::msg::Pose2D & pose_b)
 {
   double x_diff = pose_a.x - pose_b.x;
   double y_diff = pose_a.y - pose_b.y;
+
   return x_diff * x_diff + y_diff * y_diff;
 }
 
-nav_2d_msgs::msg::Path2D DWBLocalPlanner::transformGlobalPlan(
+nav_2d_msgs::msg::Path2D
+DWBLocalPlanner::transformGlobalPlan(
   const nav_2d_msgs::msg::Pose2DStamped & pose)
 {
   if (global_plan_.poses.size() == 0) {
@@ -479,6 +526,5 @@ nav_2d_msgs::msg::Path2D DWBLocalPlanner::transformGlobalPlan(
 
 }  // namespace dwb_core
 
-
-//  register this planner as a LocalPlanner plugin
+// Register this planner as a LocalPlanner plugin
 // PLUGINLIB_EXPORT_CLASS(dwb_core::DWBLocalPlanner, nav_core2::LocalPlanner)
diff --git a/nav2_dwb_controller/dwb_core/src/publisher.cpp b/nav2_dwb_controller/dwb_core/src/publisher.cpp
index 7e83788082db8df3a81851edb4003a7a3dbf1a06..22d88c4e5caffcce885159c29a9888f6297121f4 100644
--- a/nav2_dwb_controller/dwb_core/src/publisher.cpp
+++ b/nav2_dwb_controller/dwb_core/src/publisher.cpp
@@ -33,15 +33,16 @@
  */
 
 #include "dwb_core/publisher.hpp"
-#include <vector>
+
+#include <algorithm>
 #include <memory>
 #include <string>
-#include <algorithm>
-#include "visualization_msgs/msg/marker.hpp"
-#include "visualization_msgs/msg/marker_array.hpp"
-#include "sensor_msgs/msg/point_cloud2.hpp"
+#include <vector>
+
 #include "nav_2d_utils/conversions.hpp"
-//#include <sensor_msgs/point_cloud_conversion.hpp> // NOLINT cpplint doesn't like commented out header file
+#include "sensor_msgs/msg/point_cloud2.hpp"
+#include "visualization_msgs/msg/marker_array.hpp"
+#include "visualization_msgs/msg/marker.hpp"
 
 using std::max;
 using std::string;
@@ -49,52 +50,92 @@ using std::string;
 namespace dwb_core
 {
 
-void DWBPublisher::initialize(const std::shared_ptr<rclcpp::Node> & nh)
+DWBPublisher::DWBPublisher(nav2_lifecycle::LifecycleNode::SharedPtr node)
+: node_(node)
 {
-  nh_ = nh;
-  // Load Publishers
-  nh_->get_parameter_or("publish_evaluation", publish_evaluation_, true);
-  if (publish_evaluation_) {
-    eval_pub_ = nh_->create_publisher<dwb_msgs::msg::LocalPlanEvaluation>("evaluation", 1);
-  }
-
-  nh_->get_parameter_or("publish_global_plan", publish_global_plan_, true);
-  if (publish_global_plan_) {
-    global_pub_ = nh_->create_publisher<nav_msgs::msg::Path>("global_plan", 1);
-  }
+  node_->declare_parameter("publish_evaluation", rclcpp::ParameterValue(true));
+  node_->declare_parameter("publish_global_plan", rclcpp::ParameterValue(true));
+  node_->declare_parameter("publish_transformed_plan", rclcpp::ParameterValue(true));
+  node_->declare_parameter("publish_local_plan", rclcpp::ParameterValue(true));
+  node_->declare_parameter("publish_trajectories", rclcpp::ParameterValue(true));
+  node_->declare_parameter("publish_cost_grid_pc", rclcpp::ParameterValue(false));
+}
 
-  nh_->get_parameter_or("publish_transformed_plan", publish_transformed_, true);
-  if (publish_transformed_) {
-    transformed_pub_ = nh_->create_publisher<nav_msgs::msg::Path>("transformed_global_plan", 1);
-  }
+nav2_lifecycle::CallbackReturn
+DWBPublisher::on_configure(const rclcpp_lifecycle::State & /*state*/)
+{
+  node_->get_parameter("publish_evaluation", publish_evaluation_);
+  node_->get_parameter("publish_global_plan", publish_global_plan_);
+  node_->get_parameter("publish_transformed_plan", publish_transformed_);
+  node_->get_parameter("publish_local_plan", publish_local_plan_);
+  node_->get_parameter("publish_trajectories", publish_trajectories_);
+  node_->get_parameter("publish_cost_grid_pc", publish_cost_grid_pc_);
 
-  nh_->get_parameter_or("publish_local_plan", publish_local_plan_, true);
-  if (publish_local_plan_) {
-    local_pub_ = nh_->create_publisher<nav_msgs::msg::Path>("local_plan", 1);
-  }
+  eval_pub_ = node_->create_publisher<dwb_msgs::msg::LocalPlanEvaluation>("evaluation", 1);
+  global_pub_ = node_->create_publisher<nav_msgs::msg::Path>("received_global_plan", 1);
+  transformed_pub_ = node_->create_publisher<nav_msgs::msg::Path>("transformed_global_plan", 1);
+  local_pub_ = node_->create_publisher<nav_msgs::msg::Path>("local_plan", 1);
+  marker_pub_ = node_->create_publisher<visualization_msgs::msg::MarkerArray>("marker", 1);
+  cost_grid_pc_pub_ = node_->create_publisher<sensor_msgs::msg::PointCloud>("cost_cloud", 1);
 
-  nh_->get_parameter_or("publish_trajectories", publish_trajectories_, true);
-  if (publish_trajectories_) {
-    marker_pub_ = nh_->create_publisher<visualization_msgs::msg::MarkerArray>("marker", 1);
-  }
   prev_marker_count_ = 0;
 
-  nh_->get_parameter_or("publish_cost_grid_pc", publish_cost_grid_pc_, false);
-  if (publish_cost_grid_pc_) {
-    cost_grid_pc_pub_ = nh_->create_publisher<sensor_msgs::msg::PointCloud>("cost_cloud", 1);
-  }
+  return nav2_lifecycle::CallbackReturn::SUCCESS;
+}
+
+nav2_lifecycle::CallbackReturn
+DWBPublisher::on_activate(const rclcpp_lifecycle::State & /*state*/)
+{
+  eval_pub_->on_activate();
+  global_pub_->on_activate();
+  transformed_pub_->on_activate();
+  local_pub_->on_activate();
+  marker_pub_->on_activate();
+  cost_grid_pc_pub_->on_activate();
+
+  return nav2_lifecycle::CallbackReturn::SUCCESS;
+}
+
+nav2_lifecycle::CallbackReturn
+DWBPublisher::on_deactivate(const rclcpp_lifecycle::State & /*state*/)
+{
+  eval_pub_->on_deactivate();
+  global_pub_->on_deactivate();
+  transformed_pub_->on_deactivate();
+  local_pub_->on_deactivate();
+  marker_pub_->on_deactivate();
+  cost_grid_pc_pub_->on_deactivate();
+
+  return nav2_lifecycle::CallbackReturn::SUCCESS;
 }
 
-void DWBPublisher::publishEvaluation(std::shared_ptr<dwb_msgs::msg::LocalPlanEvaluation> results)
+nav2_lifecycle::CallbackReturn
+DWBPublisher::on_cleanup(const rclcpp_lifecycle::State & /*state*/)
+{
+  eval_pub_.reset();
+  global_pub_.reset();
+  transformed_pub_.reset();
+  local_pub_.reset();
+  marker_pub_.reset();
+  cost_grid_pc_pub_.reset();
+
+  return nav2_lifecycle::CallbackReturn::SUCCESS;
+}
+
+void
+DWBPublisher::publishEvaluation(std::shared_ptr<dwb_msgs::msg::LocalPlanEvaluation> results)
 {
   if (results == nullptr) {return;}
+
   if (publish_evaluation_) {
     eval_pub_->publish(*results);
   }
+
   publishTrajectories(*results);
 }
 
-void DWBPublisher::publishTrajectories(const dwb_msgs::msg::LocalPlanEvaluation & results)
+void
+DWBPublisher::publishTrajectories(const dwb_msgs::msg::LocalPlanEvaluation & results)
 {
   if (!publish_trajectories_) {return;}
   visualization_msgs::msg::MarkerArray ma;
@@ -152,7 +193,8 @@ void DWBPublisher::publishTrajectories(const dwb_msgs::msg::LocalPlanEvaluation
   marker_pub_->publish(ma);
 }
 
-void DWBPublisher::publishLocalPlan(
+void
+DWBPublisher::publishLocalPlan(
   const std_msgs::msg::Header & header,
   const dwb_msgs::msg::Trajectory2D & traj)
 {
@@ -163,7 +205,8 @@ void DWBPublisher::publishLocalPlan(
   local_pub_->publish(path);
 }
 
-void DWBPublisher::publishCostGrid(
+void
+DWBPublisher::publishCostGrid(
   const CostmapROSPtr costmap_ros,
   const std::vector<TrajectoryCritic::Ptr> critics)
 {
@@ -171,7 +214,7 @@ void DWBPublisher::publishCostGrid(
 
   sensor_msgs::msg::PointCloud cost_grid_pc;
   cost_grid_pc.header.frame_id = costmap_ros->getGlobalFrameID();
-  cost_grid_pc.header.stamp = nh_->now();
+  cost_grid_pc.header.stamp = node_->now();
 
   nav2_costmap_2d::Costmap2D * costmap = costmap_ros->getCostmap();
   double x_coord, y_coord;
@@ -212,22 +255,26 @@ void DWBPublisher::publishCostGrid(
   cost_grid_pc_pub_->publish(cost_grid_pc);
 }
 
-void DWBPublisher::publishGlobalPlan(const nav_2d_msgs::msg::Path2D plan)
+void
+DWBPublisher::publishGlobalPlan(const nav_2d_msgs::msg::Path2D plan)
 {
   publishGenericPlan(plan, *global_pub_, publish_global_plan_);
 }
 
-void DWBPublisher::publishTransformedPlan(const nav_2d_msgs::msg::Path2D plan)
+void
+DWBPublisher::publishTransformedPlan(const nav_2d_msgs::msg::Path2D plan)
 {
   publishGenericPlan(plan, *transformed_pub_, publish_transformed_);
 }
 
-void DWBPublisher::publishLocalPlan(const nav_2d_msgs::msg::Path2D plan)
+void
+DWBPublisher::publishLocalPlan(const nav_2d_msgs::msg::Path2D plan)
 {
   publishGenericPlan(plan, *local_pub_, publish_local_plan_);
 }
 
-void DWBPublisher::publishGenericPlan(
+void
+DWBPublisher::publishGenericPlan(
   const nav_2d_msgs::msg::Path2D plan,
   rclcpp::Publisher<nav_msgs::msg::Path> & pub, bool flag)
 {
@@ -236,7 +283,8 @@ void DWBPublisher::publishGenericPlan(
   pub.publish(path);
 }
 
-void DWBPublisher::addDeleteMarkers(
+void
+DWBPublisher::addDeleteMarkers(
   visualization_msgs::msg::MarkerArray & ma,
   unsigned startingId,
   string & ns
diff --git a/nav2_dwb_controller/dwb_critics/package.xml b/nav2_dwb_controller/dwb_critics/package.xml
index 92186487b1ab803bafc16abc563b1211c4b5d7c7..21d3c46789570e8aab19d720bfa3f9f8910ec198 100644
--- a/nav2_dwb_controller/dwb_critics/package.xml
+++ b/nav2_dwb_controller/dwb_critics/package.xml
@@ -3,9 +3,7 @@
   <name>dwb_critics</name>
   <version>0.1.5</version>
   <description>The dwb_critics package</description>
-
   <maintainer email="davidvlu@gmail.com">David V. Lu!!</maintainer>
-
   <license>BSD</license>
 
   <buildtool_depend>ament_cmake</buildtool_depend>
diff --git a/nav2_dwb_controller/dwb_msgs/package.xml b/nav2_dwb_controller/dwb_msgs/package.xml
index 5969c32b79d8e71416722796bb410e91009bc5bb..ab410f7d2c7802ffe4d11926880338e7a7bc2619 100644
--- a/nav2_dwb_controller/dwb_msgs/package.xml
+++ b/nav2_dwb_controller/dwb_msgs/package.xml
@@ -4,9 +4,7 @@
   <name>dwb_msgs</name>
   <version>0.1.5</version>
   <description>Message/Service definitions specifically for the dwb_core</description>
-
   <maintainer email="davidvlu@gmail.com">David V. Lu!!</maintainer>
-
   <license>BSD</license>
 
   <buildtool_depend>ament_cmake</buildtool_depend>
diff --git a/nav2_dwb_controller/dwb_plugins/CMakeLists.txt b/nav2_dwb_controller/dwb_plugins/CMakeLists.txt
index c1bbb903bef41a1c7de44fe58993a7c2c4011d7e..1df6056478a229c2f48ae854e3339d0a81b92cc8 100644
--- a/nav2_dwb_controller/dwb_plugins/CMakeLists.txt
+++ b/nav2_dwb_controller/dwb_plugins/CMakeLists.txt
@@ -10,7 +10,6 @@ find_package(nav_2d_utils REQUIRED)
 find_package(pluginlib REQUIRED)
 find_package(rclcpp REQUIRED)
 find_package(nav2_util REQUIRED)
-find_package(nav2_dynamic_params REQUIRED)
 
 nav2_package()
 
@@ -22,7 +21,6 @@ set(dependencies
   pluginlib
   rclcpp
   nav2_util
-  nav2_dynamic_params
 )
 
 include_directories(
diff --git a/nav2_dwb_controller/dwb_plugins/include/dwb_plugins/kinematic_parameters.hpp b/nav2_dwb_controller/dwb_plugins/include/dwb_plugins/kinematic_parameters.hpp
index 15e19836a7fa86c25619391a1d28f6afa94c3049..1ec7301b1fdcccf9cece774abd5c73ec70f8d22b 100644
--- a/nav2_dwb_controller/dwb_plugins/include/dwb_plugins/kinematic_parameters.hpp
+++ b/nav2_dwb_controller/dwb_plugins/include/dwb_plugins/kinematic_parameters.hpp
@@ -36,21 +36,22 @@
 #define DWB_PLUGINS__KINEMATIC_PARAMETERS_HPP_
 
 #include <memory>
+
 #include "rclcpp/rclcpp.hpp"
-#include "nav2_dynamic_params/dynamic_params_client.hpp"
+#include "nav2_lifecycle/lifecycle_node.hpp"
 
 namespace dwb_plugins
 {
 
 /**
  * @class KinematicParameters
- * @brief A dynamically reconfigurable class containing one representation of the robot's kinematics
+ * @brief A class containing one representation of the robot's kinematics
  */
 class KinematicParameters
 {
 public:
   KinematicParameters();
-  void initialize(const std::shared_ptr<rclcpp::Node> & nh);
+  void initialize(const nav2_lifecycle::LifecycleNode::SharedPtr & nh);
 
   inline double getMinX() {return min_vel_x_;}
   inline double getMaxX() {return max_vel_x_;}
@@ -92,20 +93,26 @@ public:
 
 protected:
   // For parameter descriptions, see cfg/KinematicParams.cfg
-  double min_vel_x_, min_vel_y_;
-  double max_vel_x_, max_vel_y_, max_vel_theta_;
-
-  double min_speed_xy_, max_speed_xy_;
-  double min_speed_theta_;
-
-  double acc_lim_x_, acc_lim_y_, acc_lim_theta_;
-  double decel_lim_x_, decel_lim_y_, decel_lim_theta_;
+  double min_vel_x_{0};
+  double min_vel_y_{0};
+  double max_vel_x_{0};
+  double max_vel_y_{0};
+  double max_vel_theta_{0};
+  double min_speed_xy_{0};
+  double max_speed_xy_{0};
+  double min_speed_theta_{0};
+  double acc_lim_x_{0};
+  double acc_lim_y_{0};
+  double acc_lim_theta_{0};
+  double decel_lim_x_{0};
+  double decel_lim_y_{0};
+  double decel_lim_theta_{0};
 
   // Cached square values of min_speed_xy and max_speed_xy
-  double min_speed_xy_sq_, max_speed_xy_sq_;
+  double min_speed_xy_sq_{0};
+  double max_speed_xy_sq_{0};
 
   void reconfigureCB();
-  std::unique_ptr<nav2_dynamic_params::DynamicParamsClient> dsrv_;
 };
 
 }  // namespace dwb_plugins
diff --git a/nav2_dwb_controller/dwb_plugins/include/dwb_plugins/limited_accel_generator.hpp b/nav2_dwb_controller/dwb_plugins/include/dwb_plugins/limited_accel_generator.hpp
index fb453305bd320a12bef3ada64650ca5d54e63e91..3ad592cd7a189e7176482d65fbab025872210b57 100644
--- a/nav2_dwb_controller/dwb_plugins/include/dwb_plugins/limited_accel_generator.hpp
+++ b/nav2_dwb_controller/dwb_plugins/include/dwb_plugins/limited_accel_generator.hpp
@@ -36,7 +36,9 @@
 #define DWB_PLUGINS__LIMITED_ACCEL_GENERATOR_HPP_
 
 #include <memory>
+
 #include "dwb_plugins/standard_traj_generator.hpp"
+#include "nav2_lifecycle/lifecycle_node.hpp"
 
 namespace dwb_plugins
 {
@@ -47,8 +49,8 @@ namespace dwb_plugins
 class LimitedAccelGenerator : public StandardTrajectoryGenerator
 {
 public:
-  void initialize(const std::shared_ptr<rclcpp::Node> & nh) override;
-  void checkUseDwaParam(const std::shared_ptr<rclcpp::Node> & nh) override;
+  void initialize(const nav2_lifecycle::LifecycleNode::SharedPtr & nh) override;
+  void checkUseDwaParam(const nav2_lifecycle::LifecycleNode::SharedPtr & nh) override;
   void startNewIteration(const nav_2d_msgs::msg::Twist2D & current_velocity) override;
   dwb_msgs::msg::Trajectory2D generateTrajectory(
     const geometry_msgs::msg::Pose2D & start_pose,
diff --git a/nav2_dwb_controller/dwb_plugins/include/dwb_plugins/simple_goal_checker.hpp b/nav2_dwb_controller/dwb_plugins/include/dwb_plugins/simple_goal_checker.hpp
index d3a7066329015ce5ce367bd9afe038b6d39ed041..ab17824814e1f06194f966dbf859f1c41723e185 100644
--- a/nav2_dwb_controller/dwb_plugins/include/dwb_plugins/simple_goal_checker.hpp
+++ b/nav2_dwb_controller/dwb_plugins/include/dwb_plugins/simple_goal_checker.hpp
@@ -36,8 +36,10 @@
 #define DWB_PLUGINS__SIMPLE_GOAL_CHECKER_HPP_
 
 #include <memory>
+
 #include "rclcpp/rclcpp.hpp"
 #include "dwb_core/goal_checker.hpp"
+#include "nav2_lifecycle/lifecycle_node.hpp"
 
 namespace dwb_plugins
 {
@@ -51,7 +53,7 @@ class SimpleGoalChecker : public dwb_core::GoalChecker
 public:
   SimpleGoalChecker();
   // Standard GoalChecker Interface
-  void initialize(const std::shared_ptr<rclcpp::Node> & nh) override;
+  void initialize(const nav2_lifecycle::LifecycleNode::SharedPtr & nh) override;
   bool isGoalReached(
     const geometry_msgs::msg::Pose2D & query_pose, const geometry_msgs::msg::Pose2D & goal_pose,
     const nav_2d_msgs::msg::Twist2D & velocity) override;
diff --git a/nav2_dwb_controller/dwb_plugins/include/dwb_plugins/standard_traj_generator.hpp b/nav2_dwb_controller/dwb_plugins/include/dwb_plugins/standard_traj_generator.hpp
index 558e884667c7eeb72cf09f030ad3b08cd8450d6f..de92a46bb534e960b20b77ca06aecfcc771e3ac5 100644
--- a/nav2_dwb_controller/dwb_plugins/include/dwb_plugins/standard_traj_generator.hpp
+++ b/nav2_dwb_controller/dwb_plugins/include/dwb_plugins/standard_traj_generator.hpp
@@ -37,10 +37,12 @@
 
 #include <vector>
 #include <memory>
+
 #include "rclcpp/rclcpp.hpp"
 #include "dwb_core/trajectory_generator.hpp"
 #include "dwb_plugins/velocity_iterator.hpp"
 #include "dwb_plugins/kinematic_parameters.hpp"
+#include "nav2_lifecycle/lifecycle_node.hpp"
 
 namespace dwb_plugins
 {
@@ -53,7 +55,7 @@ class StandardTrajectoryGenerator : public dwb_core::TrajectoryGenerator
 {
 public:
   // Standard TrajectoryGenerator interface
-  void initialize(const std::shared_ptr<rclcpp::Node> & nh) override;
+  void initialize(const nav2_lifecycle::LifecycleNode::SharedPtr & nh) override;
   void startNewIteration(const nav_2d_msgs::msg::Twist2D & current_velocity) override;
   bool hasMoreTwists() override;
   nav_2d_msgs::msg::Twist2D nextTwist() override;
@@ -67,7 +69,7 @@ protected:
   /**
    * @brief Initialize the VelocityIterator pointer. Put in its own function for easy overriding
    */
-  virtual void initializeIterator(const std::shared_ptr<rclcpp::Node> & nh);
+  virtual void initializeIterator(const nav2_lifecycle::LifecycleNode::SharedPtr & nh);
 
   /**
    * @brief Check if the deprecated use_dwa parameter is set to the functionality that matches this class
@@ -76,7 +78,7 @@ protected:
    * LimitedAccelGenerator. If use_dwa was false, this class should be used. If it was true, then LimitedAccelGenerator.
    * If this is NOT the case, this function will throw an exception.
    */
-  virtual void checkUseDwaParam(const std::shared_ptr<rclcpp::Node> & nh);
+  virtual void checkUseDwaParam(const nav2_lifecycle::LifecycleNode::SharedPtr & nh);
 
   /**
    * @brief Calculate the velocity after a set period of time, given the desired velocity and acceleration limits
diff --git a/nav2_dwb_controller/dwb_plugins/include/dwb_plugins/stopped_goal_checker.hpp b/nav2_dwb_controller/dwb_plugins/include/dwb_plugins/stopped_goal_checker.hpp
index ac9170a7550dd96a55659da57fab66a73e40516e..da62c88718de2de83456e8a05632cb60ac184704 100644
--- a/nav2_dwb_controller/dwb_plugins/include/dwb_plugins/stopped_goal_checker.hpp
+++ b/nav2_dwb_controller/dwb_plugins/include/dwb_plugins/stopped_goal_checker.hpp
@@ -36,8 +36,10 @@
 #define DWB_PLUGINS__STOPPED_GOAL_CHECKER_HPP_
 
 #include <memory>
+
 #include "rclcpp/rclcpp.hpp"
 #include "dwb_plugins/simple_goal_checker.hpp"
+#include "nav2_lifecycle/lifecycle_node.hpp"
 
 namespace dwb_plugins
 {
@@ -51,7 +53,7 @@ class StoppedGoalChecker : public SimpleGoalChecker
 public:
   StoppedGoalChecker();
   // Standard GoalChecker Interface
-  void initialize(const std::shared_ptr<rclcpp::Node> & nh) override;
+  void initialize(const nav2_lifecycle::LifecycleNode::SharedPtr & nh) override;
   bool isGoalReached(
     const geometry_msgs::msg::Pose2D & query_pose, const geometry_msgs::msg::Pose2D & goal_pose,
     const nav_2d_msgs::msg::Twist2D & velocity) override;
diff --git a/nav2_dwb_controller/dwb_plugins/include/dwb_plugins/velocity_iterator.hpp b/nav2_dwb_controller/dwb_plugins/include/dwb_plugins/velocity_iterator.hpp
index ec8cb21ca3dd2a2200d8724f3fadac4d65a3272d..b9613de94b77fb41770809eed94322914ee71bdd 100644
--- a/nav2_dwb_controller/dwb_plugins/include/dwb_plugins/velocity_iterator.hpp
+++ b/nav2_dwb_controller/dwb_plugins/include/dwb_plugins/velocity_iterator.hpp
@@ -36,9 +36,11 @@
 #define DWB_PLUGINS__VELOCITY_ITERATOR_HPP_
 
 #include <memory>
+
 #include "rclcpp/rclcpp.hpp"
 #include "nav_2d_msgs/msg/twist2_d.hpp"
 #include "dwb_plugins/kinematic_parameters.hpp"
+#include "nav2_lifecycle/lifecycle_node.hpp"
 
 namespace dwb_plugins
 {
@@ -47,7 +49,7 @@ class VelocityIterator
 public:
   virtual ~VelocityIterator() {}
   virtual void initialize(
-    const std::shared_ptr<rclcpp::Node> & nh,
+    const nav2_lifecycle::LifecycleNode::SharedPtr & nh,
     KinematicParameters::Ptr kinematics) = 0;
   virtual void startNewIteration(const nav_2d_msgs::msg::Twist2D & current_velocity, double dt) = 0;
   virtual bool hasMoreTwists() = 0;
diff --git a/nav2_dwb_controller/dwb_plugins/include/dwb_plugins/xy_theta_iterator.hpp b/nav2_dwb_controller/dwb_plugins/include/dwb_plugins/xy_theta_iterator.hpp
index 59ded289daf7a18a6dd98e550900e2860009790a..5d81005b0cc1eecc1cf6658d639853d90fda711d 100644
--- a/nav2_dwb_controller/dwb_plugins/include/dwb_plugins/xy_theta_iterator.hpp
+++ b/nav2_dwb_controller/dwb_plugins/include/dwb_plugins/xy_theta_iterator.hpp
@@ -36,8 +36,10 @@
 #define DWB_PLUGINS__XY_THETA_ITERATOR_HPP_
 
 #include <memory>
+
 #include "dwb_plugins/velocity_iterator.hpp"
 #include "dwb_plugins/one_d_velocity_iterator.hpp"
+#include "nav2_lifecycle/lifecycle_node.hpp"
 
 namespace dwb_plugins
 {
@@ -47,7 +49,7 @@ public:
   XYThetaIterator()
   : kinematics_(nullptr), x_it_(nullptr), y_it_(nullptr), th_it_(nullptr) {}
   void initialize(
-    const std::shared_ptr<rclcpp::Node> & nh,
+    const nav2_lifecycle::LifecycleNode::SharedPtr & nh,
     KinematicParameters::Ptr kinematics) override;
   void startNewIteration(const nav_2d_msgs::msg::Twist2D & current_velocity, double dt) override;
   bool hasMoreTwists() override;
diff --git a/nav2_dwb_controller/dwb_plugins/package.xml b/nav2_dwb_controller/dwb_plugins/package.xml
index ba1a865d8678593367aebc715489381ee8f57c97..d079fd3d41fc49785a27e9ecb90b1d961077cf80 100644
--- a/nav2_dwb_controller/dwb_plugins/package.xml
+++ b/nav2_dwb_controller/dwb_plugins/package.xml
@@ -6,9 +6,7 @@
       Standard implementations of the GoalChecker
       and TrajectoryGenerators for dwb_core
   </description>
-
   <maintainer email="davidvlu@gmail.com">David V. Lu!!</maintainer>
-
   <license>BSD</license>
 
   <buildtool_depend>ament_cmake</buildtool_depend>
@@ -21,7 +19,6 @@
   <depend>pluginlib</depend>
   <depend>rclcpp</depend>
   <depend>nav2_util</depend>
-  <depend>nav2_dynamic_params</depend>
 
   <test_depend>ament_lint_common</test_depend>
   <test_depend>ament_lint_auto</test_depend>
diff --git a/nav2_dwb_controller/dwb_plugins/src/kinematic_parameters.cpp b/nav2_dwb_controller/dwb_plugins/src/kinematic_parameters.cpp
index 06fc6e9aa79a1b074453e2c687aba650ea8ed1b1..9d76f9729efcb73d0329e5fc29ce699936ce3fb8 100644
--- a/nav2_dwb_controller/dwb_plugins/src/kinematic_parameters.cpp
+++ b/nav2_dwb_controller/dwb_plugins/src/kinematic_parameters.cpp
@@ -33,9 +33,11 @@
  */
 
 #include "dwb_plugins/kinematic_parameters.hpp"
+
 #include <cmath>
 #include <memory>
 #include <string>
+
 #include "nav_2d_utils/parameters.hpp"
 
 using std::fabs;
@@ -44,34 +46,11 @@ using nav_2d_utils::moveDeprecatedParameter;
 namespace dwb_plugins
 {
 
-/**
- * @brief Helper function to set the deceleration to the negative acceleration if it was not already set.
- * @param nh NodeHandle
- * @param dimension String representing the dimension, used in constructing parameter names
- */
-void setDecelerationAsNeeded(const std::shared_ptr<rclcpp::Node> & nh, const std::string dimension)
-{
-  std::string decel_param = "decel_lim_" + dimension;
-  double temp;
-  if (nh->get_parameter(decel_param, temp)) {return;}
-
-  std::string accel_param = "acc_lim_" + dimension;
-  double accel;
-  if (!nh->get_parameter(accel_param, accel)) {return;}
-
-  nh->set_parameters({rclcpp::Parameter(decel_param, -accel)});
-}
-
 KinematicParameters::KinematicParameters()
-: min_vel_x_(0.0), min_vel_y_(0.0), max_vel_x_(0.0), max_vel_y_(0.0), max_vel_theta_(0.0),
-  min_speed_xy_(0.0), max_speed_xy_(0.0), min_speed_theta_(0.0),
-  acc_lim_x_(0.0), acc_lim_y_(0.0), acc_lim_theta_(0.0),
-  decel_lim_x_(0.0), decel_lim_y_(0.0), decel_lim_theta_(0.0),
-  min_speed_xy_sq_(0.0), max_speed_xy_sq_(0.0)
 {
 }
 
-void KinematicParameters::initialize(const std::shared_ptr<rclcpp::Node> & nh)
+void KinematicParameters::initialize(const nav2_lifecycle::LifecycleNode::SharedPtr & nh)
 {
   // Special handling for renamed parameters
   moveDeprecatedParameter<double>(nh, "max_vel_theta", "max_rot_vel");
@@ -79,53 +58,23 @@ void KinematicParameters::initialize(const std::shared_ptr<rclcpp::Node> & nh)
   moveDeprecatedParameter<double>(nh, "max_speed_xy", "max_trans_vel");
   moveDeprecatedParameter<double>(nh, "min_speed_theta", "min_rot_vel");
 
-  // Set the deceleration parameters to negative the acceleration if the
-  // deceleration not already specified
-  setDecelerationAsNeeded(nh, "x");
-  setDecelerationAsNeeded(nh, "y");
-  setDecelerationAsNeeded(nh, "theta");
-
-  dsrv_ = std::make_unique<nav2_dynamic_params::DynamicParamsClient>(nh);
-  dsrv_->add_parameters({
-      "min_vel_x",
-      "min_vel_y",
-      "max_vel_x",
-      "max_vel_y",
-      "max_vel_theta",
-      "min_speed_xy",
-      "max_speed_xy",
-      "min_speed_theta",
-      "acc_lim_x",
-      "acc_lim_y",
-      "acc_lim_theta",
-      "decel_lim_x",
-      "decel_lim_y",
-      "decel_lim_theta"
-    });
-  dsrv_->set_callback([this]() {reconfigureCB();});
-}
-
-#define UPDATE_PARAMETER(name) dsrv_->get_event_param_or(#name, name ## _, 0.0)
-void KinematicParameters::reconfigureCB()
-{
-  UPDATE_PARAMETER(min_vel_x);
-  UPDATE_PARAMETER(min_vel_y);
-  UPDATE_PARAMETER(max_vel_x);
-  UPDATE_PARAMETER(max_vel_y);
-  UPDATE_PARAMETER(max_vel_theta);
+  nh->get_parameter_or_set("min_vel_x", min_vel_x_, 0.0);
+  nh->get_parameter_or_set("min_vel_y", min_vel_y_, 0.0);
+  nh->get_parameter_or_set("max_vel_x", max_vel_x_, 0.0);
+  nh->get_parameter_or_set("max_vel_y", max_vel_y_, 0.0);
+  nh->get_parameter_or_set("max_vel_theta", max_vel_theta_, 0.0);
+  nh->get_parameter_or_set("min_speed_xy", min_speed_xy_, 0.0);
+  nh->get_parameter_or_set("max_speed_xy", max_speed_xy_, 0.0);
+  nh->get_parameter_or_set("min_speed_theta", min_speed_theta_, 0.0);
+  nh->get_parameter_or_set("acc_lim_x", acc_lim_x_, 0.0);
+  nh->get_parameter_or_set("acc_lim_y", acc_lim_y_, 0.0);
+  nh->get_parameter_or_set("acc_lim_theta", acc_lim_theta_, 0.0);
+  nh->get_parameter_or_set("decel_lim_x", decel_lim_x_, 0.0);
+  nh->get_parameter_or_set("decel_lim_y", decel_lim_y_, 0.0);
+  nh->get_parameter_or_set("decel_lim_theta", decel_lim_theta_, 0.0);
 
-  UPDATE_PARAMETER(min_speed_xy);
-  UPDATE_PARAMETER(max_speed_xy);
   min_speed_xy_sq_ = min_speed_xy_ * min_speed_xy_;
   max_speed_xy_sq_ = max_speed_xy_ * max_speed_xy_;
-  UPDATE_PARAMETER(min_speed_theta);
-
-  UPDATE_PARAMETER(acc_lim_x);
-  UPDATE_PARAMETER(acc_lim_y);
-  UPDATE_PARAMETER(acc_lim_theta);
-  UPDATE_PARAMETER(decel_lim_x);
-  UPDATE_PARAMETER(decel_lim_y);
-  UPDATE_PARAMETER(decel_lim_theta);
 }
 
 bool KinematicParameters::isValidSpeed(double x, double y, double theta)
diff --git a/nav2_dwb_controller/dwb_plugins/src/limited_accel_generator.cpp b/nav2_dwb_controller/dwb_plugins/src/limited_accel_generator.cpp
index 7a2ac9dc6ea26c14da0b05ca783c5962ae2d2c5a..684d5a2a38ad3c70dd28fd320f22b1768635d221 100644
--- a/nav2_dwb_controller/dwb_plugins/src/limited_accel_generator.cpp
+++ b/nav2_dwb_controller/dwb_plugins/src/limited_accel_generator.cpp
@@ -43,7 +43,7 @@
 namespace dwb_plugins
 {
 
-void LimitedAccelGenerator::initialize(const std::shared_ptr<rclcpp::Node> & nh)
+void LimitedAccelGenerator::initialize(const nav2_lifecycle::LifecycleNode::SharedPtr & nh)
 {
   StandardTrajectoryGenerator::initialize(nh);
   if (nh->get_parameter("sim_period", acceleration_time_)) {
@@ -61,7 +61,7 @@ void LimitedAccelGenerator::initialize(const std::shared_ptr<rclcpp::Node> & nh)
   }
 }
 
-void LimitedAccelGenerator::checkUseDwaParam(const std::shared_ptr<rclcpp::Node> & nh)
+void LimitedAccelGenerator::checkUseDwaParam(const nav2_lifecycle::LifecycleNode::SharedPtr & nh)
 {
   bool use_dwa;
   nh->get_parameter_or("use_dwa", use_dwa, true);
diff --git a/nav2_dwb_controller/dwb_plugins/src/simple_goal_checker.cpp b/nav2_dwb_controller/dwb_plugins/src/simple_goal_checker.cpp
index 80093a600fc45493cc0a2111ba417a4773090ceb..a4cc85c84daa17fbec03671201f93b62ca9a8b17 100644
--- a/nav2_dwb_controller/dwb_plugins/src/simple_goal_checker.cpp
+++ b/nav2_dwb_controller/dwb_plugins/src/simple_goal_checker.cpp
@@ -45,7 +45,7 @@ SimpleGoalChecker::SimpleGoalChecker()
 {
 }
 
-void SimpleGoalChecker::initialize(const std::shared_ptr<rclcpp::Node> & nh)
+void SimpleGoalChecker::initialize(const nav2_lifecycle::LifecycleNode::SharedPtr & nh)
 {
   nh->get_parameter_or("xy_goal_tolerance", xy_goal_tolerance_, 0.25);
   nh->get_parameter_or("yaw_goal_tolerance", yaw_goal_tolerance_, 0.25);
diff --git a/nav2_dwb_controller/dwb_plugins/src/standard_traj_generator.cpp b/nav2_dwb_controller/dwb_plugins/src/standard_traj_generator.cpp
index 0f8d46eecd88be0cd857a4f5cc0a0a5c432d8201..b168e2db6f2f402c91fe2614a5ee994d6b85baf0 100644
--- a/nav2_dwb_controller/dwb_plugins/src/standard_traj_generator.cpp
+++ b/nav2_dwb_controller/dwb_plugins/src/standard_traj_generator.cpp
@@ -48,7 +48,7 @@ using nav_2d_utils::loadParameterWithDeprecation;
 namespace dwb_plugins
 {
 
-void StandardTrajectoryGenerator::initialize(const std::shared_ptr<rclcpp::Node> & nh)
+void StandardTrajectoryGenerator::initialize(const nav2_lifecycle::LifecycleNode::SharedPtr & nh)
 {
   kinematics_ = std::make_shared<KinematicParameters>();
   kinematics_->initialize(nh);
@@ -77,13 +77,15 @@ void StandardTrajectoryGenerator::initialize(const std::shared_ptr<rclcpp::Node>
   }
 }
 
-void StandardTrajectoryGenerator::initializeIterator(const std::shared_ptr<rclcpp::Node> & nh)
+void StandardTrajectoryGenerator::initializeIterator(
+  const nav2_lifecycle::LifecycleNode::SharedPtr & nh)
 {
   velocity_iterator_ = std::make_shared<XYThetaIterator>();
   velocity_iterator_->initialize(nh, kinematics_);
 }
 
-void StandardTrajectoryGenerator::checkUseDwaParam(const std::shared_ptr<rclcpp::Node> & nh)
+void StandardTrajectoryGenerator::checkUseDwaParam(
+  const nav2_lifecycle::LifecycleNode::SharedPtr & nh)
 {
   bool use_dwa;
   nh->get_parameter_or("use_dwa", use_dwa, false);
diff --git a/nav2_dwb_controller/dwb_plugins/src/stopped_goal_checker.cpp b/nav2_dwb_controller/dwb_plugins/src/stopped_goal_checker.cpp
index db7000cff9dd8ab27b67dcf52d6965891ad49454..9a1af7acfd0c2e170ff104e4d179972474d19a65 100644
--- a/nav2_dwb_controller/dwb_plugins/src/stopped_goal_checker.cpp
+++ b/nav2_dwb_controller/dwb_plugins/src/stopped_goal_checker.cpp
@@ -47,7 +47,7 @@ StoppedGoalChecker::StoppedGoalChecker()
 {
 }
 
-void StoppedGoalChecker::initialize(const std::shared_ptr<rclcpp::Node> & nh)
+void StoppedGoalChecker::initialize(const nav2_lifecycle::LifecycleNode::SharedPtr & nh)
 {
   SimpleGoalChecker::initialize(nh);
   nh->get_parameter_or("rot_stopped_velocity", rot_stopped_velocity_, 0.25);
diff --git a/nav2_dwb_controller/dwb_plugins/src/xy_theta_iterator.cpp b/nav2_dwb_controller/dwb_plugins/src/xy_theta_iterator.cpp
index 5c41d8917bc745603bd04da0aaf8fa57622ab680..1e20e770bfca97366171c8a666e66ace3017d692 100644
--- a/nav2_dwb_controller/dwb_plugins/src/xy_theta_iterator.cpp
+++ b/nav2_dwb_controller/dwb_plugins/src/xy_theta_iterator.cpp
@@ -39,7 +39,7 @@
 namespace dwb_plugins
 {
 void XYThetaIterator::initialize(
-  const std::shared_ptr<rclcpp::Node> & nh,
+  const nav2_lifecycle::LifecycleNode::SharedPtr & nh,
   KinematicParameters::Ptr kinematics)
 {
   kinematics_ = kinematics;
diff --git a/nav2_dwb_controller/dwb_plugins/test/CMakeLists.txt b/nav2_dwb_controller/dwb_plugins/test/CMakeLists.txt
index 272f38cf4cac4d770c9be50e3e55c694b333fd4b..a0bb3f5057a5850a1e4e1d3dcd0113668867d7f2 100644
--- a/nav2_dwb_controller/dwb_plugins/test/CMakeLists.txt
+++ b/nav2_dwb_controller/dwb_plugins/test/CMakeLists.txt
@@ -3,5 +3,5 @@ ament_add_gtest(vtest velocity_iterator_test.cpp)
 ament_add_gtest(goal_checker goal_checker.cpp)
 target_link_libraries(goal_checker simple_goal_checker stopped_goal_checker)
 
-ament_add_gtest(twist_gen_test twist_gen.cpp)
-target_link_libraries(twist_gen_test standard_traj_generator)
+#ament_add_gtest(twist_gen_test twist_gen.cpp)
+#target_link_libraries(twist_gen_test standard_traj_generator)
diff --git a/nav2_dwb_controller/dwb_plugins/test/goal_checker.cpp b/nav2_dwb_controller/dwb_plugins/test/goal_checker.cpp
index b4feed86ebd18c8ab1888ade991de5735d560f1e..87df80a4abffb8cddf2471e4c92d401112e2d98a 100644
--- a/nav2_dwb_controller/dwb_plugins/test/goal_checker.cpp
+++ b/nav2_dwb_controller/dwb_plugins/test/goal_checker.cpp
@@ -31,6 +31,10 @@
  *  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  *  POSSIBILITY OF SUCH DAMAGE.
  */
+
+#include <memory>
+#include <string>
+
 #include "gtest/gtest.h"
 #include "dwb_plugins/simple_goal_checker.hpp"
 #include "dwb_plugins/stopped_goal_checker.hpp"
@@ -83,10 +87,49 @@ void trueFalse(
   checkMacro(gc0, x0, y0, theta0, x1, y1, theta1, xv, yv, thetav, true);
   checkMacro(gc1, x0, y0, theta0, x1, y1, theta1, xv, yv, thetav, false);
 }
+class TestLifecycleNode : public nav2_lifecycle::LifecycleNode
+{
+public:
+  explicit TestLifecycleNode(const std::string & name)
+  : nav2_lifecycle::LifecycleNode(name)
+  {
+  }
+
+  nav2_lifecycle::CallbackReturn on_configure(const rclcpp_lifecycle::State &)
+  {
+    return nav2_lifecycle::CallbackReturn::SUCCESS;
+  }
+
+  nav2_lifecycle::CallbackReturn on_activate(const rclcpp_lifecycle::State &)
+  {
+    return nav2_lifecycle::CallbackReturn::SUCCESS;
+  }
+
+  nav2_lifecycle::CallbackReturn on_deactivate(const rclcpp_lifecycle::State &)
+  {
+    return nav2_lifecycle::CallbackReturn::SUCCESS;
+  }
+
+  nav2_lifecycle::CallbackReturn on_cleanup(const rclcpp_lifecycle::State &)
+  {
+    return nav2_lifecycle::CallbackReturn::SUCCESS;
+  }
+
+  nav2_lifecycle::CallbackReturn onShutdown(const rclcpp_lifecycle::State &)
+  {
+    return nav2_lifecycle::CallbackReturn::SUCCESS;
+  }
+
+  nav2_lifecycle::CallbackReturn onError(const rclcpp_lifecycle::State &)
+  {
+    return nav2_lifecycle::CallbackReturn::SUCCESS;
+  }
+};
 
 TEST(VelocityIterator, two_checks)
 {
-  auto x = rclcpp::Node::make_shared("goal_checker");
+  auto x = std::make_shared<TestLifecycleNode>("goal_checker");
+
   SimpleGoalChecker gc;
   StoppedGoalChecker sgc;
   gc.initialize(x);
diff --git a/nav2_dwb_controller/dwb_plugins/test/twist_gen.cpp b/nav2_dwb_controller/dwb_plugins/test/twist_gen.cpp
index 4d9966604c1b18efadb316d98dcec4cee0f9f0fc..a78d9d52f0a9f0db77e82dda5a6f38626803dfc6 100644
--- a/nav2_dwb_controller/dwb_plugins/test/twist_gen.cpp
+++ b/nav2_dwb_controller/dwb_plugins/test/twist_gen.cpp
@@ -36,6 +36,7 @@
 #include <vector>
 #include <algorithm>
 #include <string>
+
 #include "gtest/gtest.h"
 #include "dwb_plugins/standard_traj_generator.hpp"
 #include "dwb_plugins/limited_accel_generator.hpp"
@@ -73,11 +74,16 @@ std::vector<rclcpp::Parameter> getDefaultKinematicParameters()
   return parameters;
 }
 
-rclcpp::Node::SharedPtr makeTestNode(const std::string & name)
+rclcpp_lifecycle::LifecycleNode::SharedPtr makeTestNode(const std::string & name)
 {
   rclcpp::NodeOptions node_options = nav2_util::get_node_options_default();
   node_options.parameter_overrides(getDefaultKinematicParameters());
-  return rclcpp::Node::make_shared(name, node_options);
+
+  auto node = rclcpp_lifecycle::LifecycleNode::make_shared(name, node_options);
+  node->on_configure(node->get_current_state());
+  node->on_activate(node->get_current_state());
+
+  return node;
 }
 
 void checkLimits(
diff --git a/nav2_dwb_controller/nav_2d_utils/include/nav_2d_utils/odom_subscriber.hpp b/nav2_dwb_controller/nav_2d_utils/include/nav_2d_utils/odom_subscriber.hpp
index 690971855ad9fa25fbaa4765c945d07db3718a3f..da1f01fd4b17c6175c4fb01fae11180b433c8893 100644
--- a/nav2_dwb_controller/nav_2d_utils/include/nav_2d_utils/odom_subscriber.hpp
+++ b/nav2_dwb_controller/nav_2d_utils/include/nav_2d_utils/odom_subscriber.hpp
@@ -35,13 +35,15 @@
 #ifndef NAV_2D_UTILS__ODOM_SUBSCRIBER_HPP_
 #define NAV_2D_UTILS__ODOM_SUBSCRIBER_HPP_
 
+#include <cmath>
 #include <memory>
 #include <mutex>
 #include <string>
-#include <cmath>
-#include "rclcpp/rclcpp.hpp"
-#include "nav_msgs/msg/odometry.hpp"
+
 #include "nav_2d_msgs/msg/twist2_d_stamped.hpp"
+#include "nav_msgs/msg/odometry.hpp"
+#include "nav2_lifecycle/lifecycle_node.hpp"
+#include "rclcpp/rclcpp.hpp"
 
 namespace nav_2d_utils
 {
@@ -59,14 +61,14 @@ public:
    * @param nh NodeHandle for creating subscriber
    * @param default_topic Name of the topic that will be loaded of the odom_topic param is not set.
    */
-  explicit OdomSubscriber(rclcpp::Node & nh, std::string default_topic = "odom")
+  explicit OdomSubscriber(nav2_lifecycle::LifecycleNode & nh, std::string default_topic = "odom")
   {
     std::string odom_topic;
     nh.get_parameter_or("odom_topic", odom_topic, default_topic);
     odom_sub_ =
       nh.create_subscription<nav_msgs::msg::Odometry>(odom_topic,
-        [&](const nav_msgs::msg::Odometry::SharedPtr msg) {odomCallback(msg);},
-        1);
+        std::bind(&OdomSubscriber::odomCallback, this, std::placeholders::_1));
+
     nh.get_parameter_or("min_x_velocity_threshold", min_x_velocity_threshold_, 0.0001);
     nh.get_parameter_or("min_y_velocity_threshold", min_y_velocity_threshold_, 0.0001);
     nh.get_parameter_or("min_theta_velocity_threshold", min_theta_velocity_threshold_, 0.0001);
@@ -94,7 +96,7 @@ protected:
     return (std::abs(velocity) > threshold) ? velocity : 0.0;
   }
 
-  std::shared_ptr<rclcpp::Subscription<nav_msgs::msg::Odometry>> odom_sub_;
+  rclcpp::Subscription<nav_msgs::msg::Odometry>::SharedPtr odom_sub_;
   nav_2d_msgs::msg::Twist2DStamped odom_vel_;
   std::mutex odom_mutex_;
 
diff --git a/nav2_dwb_controller/nav_2d_utils/include/nav_2d_utils/parameters.hpp b/nav2_dwb_controller/nav_2d_utils/include/nav_2d_utils/parameters.hpp
index 799347ce4880dd8ebeb8dca1091589845f28d2b9..59d59fd6ab2020ceaca25c7d7fc0f5d5fcabb647 100644
--- a/nav2_dwb_controller/nav_2d_utils/include/nav_2d_utils/parameters.hpp
+++ b/nav2_dwb_controller/nav_2d_utils/include/nav_2d_utils/parameters.hpp
@@ -37,7 +37,9 @@
 
 #include <string>
 #include <memory>
+
 #include "rclcpp/rclcpp.hpp"
+#include "nav2_lifecycle/lifecycle_node.hpp"
 
 // TODO(crdelsey): Remove when code is re-enabled
 #pragma GCC diagnostic push
@@ -58,7 +60,7 @@ namespace nav_2d_utils
  */
 template<class param_t>
 param_t searchAndGetParam(
-  const std::shared_ptr<rclcpp::Node> & nh, const std::string & param_name,
+  const nav2_lifecycle::LifecycleNode::SharedPtr & nh, const std::string & param_name,
   const param_t & default_value)
 {
   // TODO(crdelsey): Handle searchParam
@@ -84,7 +86,7 @@ param_t searchAndGetParam(
  */
 template<class param_t>
 param_t loadParameterWithDeprecation(
-  const std::shared_ptr<rclcpp::Node> & nh, const std::string current_name,
+  const nav2_lifecycle::LifecycleNode::SharedPtr & nh, const std::string current_name,
   const std::string old_name, const param_t & default_value)
 {
   param_t value;
@@ -108,7 +110,7 @@ param_t loadParameterWithDeprecation(
  */
 template<class param_t>
 void moveDeprecatedParameter(
-  const std::shared_ptr<rclcpp::Node> & nh, const std::string current_name,
+  const nav2_lifecycle::LifecycleNode::SharedPtr & nh, const std::string current_name,
   const std::string old_name)
 {
   param_t value;
@@ -136,7 +138,7 @@ void moveDeprecatedParameter(
  */
 template<class param_t>
 void moveParameter(
-  const std::shared_ptr<rclcpp::Node> & nh, std::string old_name,
+  const nav2_lifecycle::LifecycleNode::SharedPtr & nh, std::string old_name,
   std::string current_name, param_t default_value, bool should_delete = true)
 {
   param_t value;
diff --git a/nav2_dwb_controller/nav_2d_utils/package.xml b/nav2_dwb_controller/nav_2d_utils/package.xml
index 6eb70168dcd183ca20ff6d1ed6c358060ffbc495..5a0a1b9fbc721dc5e29c8318f6ee1098c897c2d2 100644
--- a/nav2_dwb_controller/nav_2d_utils/package.xml
+++ b/nav2_dwb_controller/nav_2d_utils/package.xml
@@ -4,9 +4,7 @@
   <name>nav_2d_utils</name>
   <version>0.1.5</version>
   <description>A handful of useful utility functions for nav_2d packages.</description>
-
   <maintainer email="davidvlu@gmail.com">David V. Lu!!</maintainer>
-
   <license>BSD</license>
 
   <buildtool_depend>ament_cmake</buildtool_depend>