diff --git a/nav2_dwb_controller/dwb_controller/CMakeLists.txt b/nav2_dwb_controller/dwb_controller/CMakeLists.txt
index bcc4f3336c338650cddfbdb00a5d14b8fd821c79..9d5db2bbf06e6334380c2afb8f93e6e869f93cd6 100644
--- a/nav2_dwb_controller/dwb_controller/CMakeLists.txt
+++ b/nav2_dwb_controller/dwb_controller/CMakeLists.txt
@@ -4,9 +4,9 @@ project(dwb_controller)
 find_package(ament_cmake REQUIRED)
 find_package(nav2_common REQUIRED)
 find_package(rclcpp REQUIRED)
+find_package(rclcpp_action REQUIRED)
 find_package(std_msgs REQUIRED)
 find_package(nav2_util REQUIRED)
-find_package(nav2_tasks REQUIRED)
 find_package(nav2_robot REQUIRED)
 find_package(nav2_msgs REQUIRED)
 find_package(dwb_core REQUIRED)
@@ -35,8 +35,8 @@ add_library(${library_name}
 
 set(dependencies
   rclcpp
+  rclcpp_action
   std_msgs
-  nav2_tasks
   nav2_robot
   nav2_msgs
   dwb_core
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 48d511a93381329eac5974e8a37fe8a6376bea57..99714f9bb1dccb7a0623df68fb54f39aef5ed664 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
@@ -24,7 +24,8 @@
 #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"
+#include "nav2_msgs/action/follow_path.hpp"
+#include "nav2_util/simple_action_server.hpp"
 
 namespace dwb_controller
 {
@@ -36,6 +37,7 @@ public:
   ~DwbController();
 
 protected:
+  // The lifecycle interface
   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;
@@ -43,23 +45,29 @@ protected:
   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);
+  using GoalHandle = rclcpp_action::ServerGoalHandle<nav2_msgs::action::FollowPath>;
+  using ActionServer = nav2_util::SimpleActionServer<nav2_msgs::action::FollowPath>;
+
+  // Our action server implements the FollowPath action
+  std::unique_ptr<ActionServer> action_server_;
+
+  // The action server callback
+  void followPath(const std::shared_ptr<GoalHandle> goal_handle);
 
   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);
 
-  // It uses a costmap node
-  dwb_core::CostmapROSPtr costmap_ros_;
+  // The DWBController contains a costmap node
+  std::shared_ptr<nav2_costmap_2d::Costmap2DROS> costmap_ros_;
   std::unique_ptr<std::thread> costmap_thread_;
 
   // Publishers and subscribers
   std::shared_ptr<nav_2d_utils::OdomSubscriber> odom_sub_;
   rclcpp_lifecycle::LifecyclePublisher<geometry_msgs::msg::Twist>::SharedPtr vel_pub_;
 
+  // The local planner
   std::unique_ptr<dwb_core::DWBLocalPlanner> planner_;
 };
 
diff --git a/nav2_dwb_controller/dwb_controller/package.xml b/nav2_dwb_controller/dwb_controller/package.xml
index b7a8f2041a35753e7c3799d686ba24eb7f9607ad..83e615248aa56fea8a57a2ed4cd4cc85aa34d2af 100644
--- a/nav2_dwb_controller/dwb_controller/package.xml
+++ b/nav2_dwb_controller/dwb_controller/package.xml
@@ -11,8 +11,8 @@
   <build_depend>nav2_common</build_depend>
 
   <depend>rclcpp</depend>
+  <depend>rclcpp_action</depend>
   <depend>std_msgs</depend>
-  <depend>nav2_tasks</depend>
   <depend>nav2_util</depend>
   <depend>nav2_robot</depend>
   <depend>nav2_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 133343f9e1642a98a60f1000d9331317ab0752e3..8989385572ef4107289657d2a6ef93648c95d959 100644
--- a/nav2_dwb_controller/dwb_controller/src/dwb_controller.cpp
+++ b/nav2_dwb_controller/dwb_controller/src/dwb_controller.cpp
@@ -24,13 +24,12 @@
 #include "dwb_controller/progress_checker.hpp"
 
 using namespace std::chrono_literals;
-using nav2_tasks::TaskStatus;
 
 namespace nav2_dwb_controller
 {
 
 DwbController::DwbController()
-: LifecycleNode("dwb_controller")
+: LifecycleNode("dwb_controller", "", true)
 {
   RCLCPP_INFO(get_logger(), "Creating");
 
@@ -62,10 +61,9 @@ DwbController::on_configure(const rclcpp_lifecycle::State & 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));
+  // Create the action server that we implement with our followPath method
+  action_server_ = std::make_unique<ActionServer>(rclcpp_node_, "FollowPath",
+      std::bind(&DwbController::followPath, this, std::placeholders::_1));
 
   return nav2_lifecycle::CallbackReturn::SUCCESS;
 }
@@ -78,7 +76,6 @@ DwbController::on_activate(const rclcpp_lifecycle::State & state)
   planner_->on_activate(state);
   costmap_ros_->on_activate(state);
   vel_pub_->on_activate();
-  task_server_->on_activate(state);
 
   return nav2_lifecycle::CallbackReturn::SUCCESS;
 }
@@ -91,7 +88,6 @@ DwbController::on_deactivate(const rclcpp_lifecycle::State & state)
   planner_->on_deactivate(state);
   costmap_ros_->on_deactivate(state);
   vel_pub_->on_deactivate();
-  task_server_->on_deactivate(state);
 
   return nav2_lifecycle::CallbackReturn::SUCCESS;
 }
@@ -104,13 +100,12 @@ DwbController::on_cleanup(const rclcpp_lifecycle::State & state)
   // 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();
+  action_server_.reset();
 
   return nav2_lifecycle::CallbackReturn::SUCCESS;
 }
@@ -129,66 +124,74 @@ DwbController::on_shutdown(const rclcpp_lifecycle::State &)
   return nav2_lifecycle::CallbackReturn::SUCCESS;
 }
 
-TaskStatus
-DwbController::followPath(const nav2_tasks::FollowPathCommand::SharedPtr command)
+void
+DwbController::followPath(const std::shared_ptr<GoalHandle> goal_handle)
 {
-  RCLCPP_INFO(get_logger(), "Starting controller");
+  RCLCPP_INFO(get_logger(), "Received a goal, begin following path");
+  auto result = std::make_shared<nav2_msgs::action::FollowPath::Result>();
+
+  std::shared_ptr<GoalHandle> current_goal_handle = goal_handle;
+
+  rclcpp::Rate loop_rate(100ms);    // period vs. hz
+
+  auto goal = current_goal_handle->get_goal();
+
   try {
-    auto path = nav_2d_utils::pathToPath2D(*command);
+    auto path = nav_2d_utils::pathToPath2D(goal->path);
 
+    RCLCPP_DEBUG(get_logger(), "Providing path to the local planner");
     planner_->setPlan(path);
-    RCLCPP_INFO(get_logger(), "Initialized");
 
     ProgressChecker progress_checker(std::shared_ptr<rclcpp::Node>(this, [](auto) {}));
     rclcpp::Rate loop_rate(10);
     while (rclcpp::ok()) {
       nav_2d_msgs::msg::Pose2DStamped pose2d;
       if (!getRobotPose(pose2d)) {
-        RCLCPP_INFO(get_logger(), "No pose. Stopping robot");
+        RCLCPP_INFO(get_logger(), "No pose. Stopping the robot");
         publishZeroVelocity();
       } else {
         if (isGoalReached(pose2d)) {
+          RCLCPP_INFO(get_logger(), "Reached the goal");
           break;
         }
         progress_checker.check(pose2d);
         auto velocity = odom_sub_->getTwist();
         auto cmd_vel_2d = planner_->computeVelocityCommands(pose2d, velocity);
-        publishVelocity(cmd_vel_2d);
+
         RCLCPP_INFO(get_logger(), "Publishing velocity at time %.2f", now().seconds());
+        publishVelocity(cmd_vel_2d);
 
-        // Check if this task has been canceled
-        if (task_server_->cancelRequested()) {
-          RCLCPP_INFO(this->get_logger(), "execute: task has been canceled");
-          task_server_->setCanceled();
+        if (current_goal_handle->is_canceling()) {
+          RCLCPP_INFO(this->get_logger(), "Canceling execution of the local planner");
+          current_goal_handle->canceled(result);
           publishZeroVelocity();
-          return TaskStatus::CANCELED;
+          return;
         }
 
         // Check if there is an update to the path to follow
-        if (task_server_->updateRequested()) {
-          // Get the new, updated path
-          auto path_cmd = std::make_shared<nav2_tasks::FollowPathCommand>();
-          task_server_->getCommandUpdate(path_cmd);
-          task_server_->setUpdated();
-
-          // and pass it to the local planner
-          auto path = nav_2d_utils::pathToPath2D(*path_cmd);
+        if (action_server_->preempt_requested()) {
+          RCLCPP_INFO(get_logger(), "Received a new goal, pre-empting the old one");
+          current_goal_handle = action_server_->get_updated_goal_handle();
+          goal = current_goal_handle->get_goal();
+
+          // If so, pass the new path to the local planner
+          auto path = nav_2d_utils::pathToPath2D(goal->path);
           planner_->setPlan(path);
         }
       }
+
       loop_rate.sleep();
     }
   } catch (nav_core2::PlannerException & e) {
     RCLCPP_ERROR(this->get_logger(), e.what());
     publishZeroVelocity();
-    return TaskStatus::FAILED;
+    current_goal_handle->abort(result);
+    return;
   }
 
-  nav2_tasks::FollowPathResult result;
-  task_server_->setResult(result);
+  RCLCPP_DEBUG(get_logger(), "DWB succeeded, setting result");
+  current_goal_handle->succeed(result);
   publishZeroVelocity();
-
-  return TaskStatus::SUCCEEDED;
 }
 
 void DwbController::publishVelocity(const nav_2d_msgs::msg::Twist2DStamped & velocity)
@@ -203,6 +206,7 @@ void DwbController::publishZeroVelocity()
   velocity.velocity.x = 0;
   velocity.velocity.y = 0;
   velocity.velocity.theta = 0;
+
   publishVelocity(velocity);
 }
 
diff --git a/nav2_dwb_controller/dwb_controller/src/main.cpp b/nav2_dwb_controller/dwb_controller/src/main.cpp
index c24c2858d705081121f77933d0594e7f0872205d..d50759ef01c87a16f9d3c491ba15f7106a7aaf3e 100644
--- a/nav2_dwb_controller/dwb_controller/src/main.cpp
+++ b/nav2_dwb_controller/dwb_controller/src/main.cpp
@@ -13,8 +13,9 @@
 // limitations under the License.
 
 #include <memory>
-#include "rclcpp/rclcpp.hpp"
+
 #include "dwb_controller/dwb_controller.hpp"
+#include "rclcpp/rclcpp.hpp"
 
 int main(int argc, char ** argv)
 {
diff --git a/nav2_dwb_controller/dwb_core/src/dwb_local_planner.cpp b/nav2_dwb_controller/dwb_core/src/dwb_local_planner.cpp
index 208a700043e205605529a8a63337d1a872c36f03..f825d013a7b42017cccfb06af3ce4588e4dc43da 100644
--- a/nav2_dwb_controller/dwb_core/src/dwb_local_planner.cpp
+++ b/nav2_dwb_controller/dwb_core/src/dwb_local_planner.cpp
@@ -62,32 +62,38 @@ DWBLocalPlanner::DWBLocalPlanner(
   goal_checker_loader_("dwb_core", "dwb_core::GoalChecker"),
   critic_loader_("dwb_core", "dwb_core::TrajectoryCritic")
 {
+  node_->declare_parameter("critics");
+  node_->declare_parameter("prune_plan", rclcpp::ParameterValue(true));
+  node_->declare_parameter("prune_distance", rclcpp::ParameterValue(1.0));
+  node_->declare_parameter("debug_trajectory_details", rclcpp::ParameterValue(false));
+  node_->declare_parameter("trajectory_generator_name",
+    rclcpp::ParameterValue(std::string("dwb_plugins::StandardTrajectoryGenerator")));
+  node_->declare_parameter("goal_checker_name",
+    rclcpp::ParameterValue(std::string("dwb_plugins::SimpleGoalChecker")));
+  node_->declare_parameter("use_dwa", rclcpp::ParameterValue(false));
 }
 
 nav2_lifecycle::CallbackReturn
 DWBLocalPlanner::on_configure(const rclcpp_lifecycle::State & state)
 {
   std::string traj_generator_name;
-  nh_->get_parameter_or("trajectory_generator_name", traj_generator_name,
-    std::string("dwb_plugins::StandardTrajectoryGenerator"));
-  traj_generator_ = traj_gen_loader_.createUniqueInstance(traj_generator_name);
-  traj_generator_->initialize(nh_);
-
   std::string 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_);
+  node_->get_parameter("prune_plan", prune_plan_);
+  node_->get_parameter("prune_distance", prune_distance_);
+  node_->get_parameter("debug_trajectory_details", debug_trajectory_details_);
+  node_->get_parameter("trajectory_generator_name", traj_generator_name);
+  node_->get_parameter("goal_checker_name", goal_checker_name);
 
   pub_ = std::make_unique<DWBPublisher>(node_);
   pub_->on_configure(state);
 
+  traj_generator_ = traj_gen_loader_.createUniqueInstance(traj_generator_name);
+  goal_checker_ = goal_checker_loader_.createUniqueInstance(goal_checker_name);
+
+  traj_generator_->initialize(nh_);
+  goal_checker_->initialize(nh_);
+
   loadCritics();
 
   return nav2_lifecycle::CallbackReturn::SUCCESS;
@@ -155,11 +161,14 @@ DWBLocalPlanner::loadCritics()
   for (unsigned int i = 0; i < critic_names.size(); i++) {
     std::string plugin_name = critic_names[i];
     std::string plugin_class;
-    node_->get_parameter_or(plugin_name + "/class", plugin_class, plugin_name);
+
+    node_->declare_parameter(plugin_name + "/class", rclcpp::ParameterValue(plugin_name));
+    node_->get_parameter(plugin_name + "/class", plugin_class);
+
     plugin_class = resolveCriticClassName(plugin_class);
 
     TrajectoryCritic::Ptr plugin = critic_loader_.createUniqueInstance(plugin_class);
-    RCLCPP_INFO(nh_->get_logger(),
+    RCLCPP_INFO(node_->get_logger(),
       "Using critic \"%s\" (%s)", plugin_name.c_str(), plugin_class.c_str());
     critics_.push_back(plugin);
     plugin->initialize(node_, plugin_name, costmap_ros_);
@@ -184,6 +193,20 @@ DWBLocalPlanner::loadBackwardsCompatibleParameters()
   critic_names.push_back("GoalDist");           // prefers trajectories that go towards
                                                 //   (local) goal, based on wave propagation
   node_->set_parameters({rclcpp::Parameter("critics", critic_names)});
+
+  node_->declare_parameter("path_distance_bias");
+  node_->declare_parameter("goal_distance_bias");
+  node_->declare_parameter("occdist_scale");
+  node_->declare_parameter("max_scaling_factor");
+  node_->declare_parameter("scaling_speed");
+  node_->declare_parameter("PathAlign.scale");
+  node_->declare_parameter("GoalAlign.scale");
+  node_->declare_parameter("PathDist.scale");
+  node_->declare_parameter("GoalDist.scale");
+  node_->declare_parameter("ObstacleFootprint.scale");
+  node_->declare_parameter("ObstacleFootprint.max_scaling_factor");
+  node_->declare_parameter("ObstacleFootprint.scaling_speed");
+
   /* *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);
diff --git a/nav2_dwb_controller/dwb_critics/src/base_obstacle.cpp b/nav2_dwb_controller/dwb_critics/src/base_obstacle.cpp
index f5032ce3f762d5a96fa9992f1d28f22c6abea7af..1dd7c2023f3fca5cd2713696908174f1b9276662 100644
--- a/nav2_dwb_controller/dwb_critics/src/base_obstacle.cpp
+++ b/nav2_dwb_controller/dwb_critics/src/base_obstacle.cpp
@@ -45,7 +45,9 @@ namespace dwb_critics
 void BaseObstacleCritic::onInit()
 {
   costmap_ = costmap_ros_->getCostmap();
-  nh_->get_parameter_or(name_ + ".sum_scores", sum_scores_, false);
+
+  nh_->declare_parameter(name_ + ".sum_scores", rclcpp::ParameterValue(false));
+  nh_->get_parameter(name_ + ".sum_scores", sum_scores_);
 }
 
 double BaseObstacleCritic::scoreTrajectory(const dwb_msgs::msg::Trajectory2D & traj)
diff --git a/nav2_dwb_controller/dwb_critics/src/map_grid.cpp b/nav2_dwb_controller/dwb_critics/src/map_grid.cpp
index 0cbf72b38422d5aee84a2c04c9ce004792eb57be..8c66565b209daa1f867bb3f9b31b60a1906bbf23 100644
--- a/nav2_dwb_controller/dwb_critics/src/map_grid.cpp
+++ b/nav2_dwb_controller/dwb_critics/src/map_grid.cpp
@@ -69,8 +69,10 @@ void MapGridCritic::onInit()
   // Always set to true, but can be overriden by subclasses
   stop_on_failure_ = true;
 
+  nh_->declare_parameter(name_ + ".aggregation_type", rclcpp::ParameterValue(std::string("last")));
+
   std::string aggro_str;
-  nh_->get_parameter_or(name_ + ".aggregation_type", aggro_str, std::string("last"));
+  nh_->get_parameter(name_ + ".aggregation_type", aggro_str);
   std::transform(aggro_str.begin(), aggro_str.end(), aggro_str.begin(), ::tolower);
   if (aggro_str == "last") {
     aggregationType_ = ScoreAggregationType::Last;
diff --git a/nav2_dwb_controller/dwb_critics/src/oscillation.cpp b/nav2_dwb_controller/dwb_critics/src/oscillation.cpp
index a0b737d910f21c650765bb1ddb83cbf525ffc219..708059b06e02879d08632585f9cb1af10a0902ac 100644
--- a/nav2_dwb_controller/dwb_critics/src/oscillation.cpp
+++ b/nav2_dwb_controller/dwb_critics/src/oscillation.cpp
@@ -97,6 +97,8 @@ void OscillationCritic::onInit()
   oscillation_reset_time_ = nav2_util::duration_from_seconds(
     nav_2d_utils::searchAndGetParam(nh_, "oscillation_reset_time", -1.0));
 
+  nh_->declare_parameter(name_ + ".x_only_threshold", rclcpp::ParameterValue(0.05));
+
   /**
    * Historical Parameter Loading
    * If x_only_threshold is set, use that.
@@ -104,7 +106,7 @@ void OscillationCritic::onInit()
    * If min_trans_vel is set in the namespace, as it used to be used for trajectory generation, complain then use that.
    * Otherwise, set x_only_threshold_ to 0.05
    */
-  nh_->get_parameter_or(name_ + ".x_only_threshold", x_only_threshold_, 0.05);
+  nh_->get_parameter(name_ + ".x_only_threshold", x_only_threshold_);
   // TODO(crdelsey): How to handle searchParam?
   // std::string resolved_name;
   // if (nh_->hasParam("x_only_threshold"))
diff --git a/nav2_dwb_controller/dwb_critics/src/prefer_forward.cpp b/nav2_dwb_controller/dwb_critics/src/prefer_forward.cpp
index ed2fdd4fb62d90c04ec05c2ac6c53ae3b2177ba9..82b08ce2e9242643abb37f993f9c379e98e08f65 100644
--- a/nav2_dwb_controller/dwb_critics/src/prefer_forward.cpp
+++ b/nav2_dwb_controller/dwb_critics/src/prefer_forward.cpp
@@ -43,10 +43,15 @@ namespace dwb_critics
 
 void PreferForwardCritic::onInit()
 {
-  nh_->get_parameter_or(name_ + ".penalty", penalty_, 1.0);
-  nh_->get_parameter_or(name_ + ".strafe_x", strafe_x_, 0.1);
-  nh_->get_parameter_or(name_ + ".strafe_theta", strafe_theta_, 0.2);
-  nh_->get_parameter_or(name_ + ".theta_scale", theta_scale_, 10.0);
+  nh_->declare_parameter(name_ + ".penalty", rclcpp::ParameterValue(1.0));
+  nh_->declare_parameter(name_ + ".strafe_x", rclcpp::ParameterValue(0.1));
+  nh_->declare_parameter(name_ + ".strafe_theta", rclcpp::ParameterValue(0.2));
+  nh_->declare_parameter(name_ + ".theta_scale", rclcpp::ParameterValue(10.0));
+
+  nh_->get_parameter(name_ + ".penalty", penalty_);
+  nh_->get_parameter(name_ + ".strafe_x", strafe_x_);
+  nh_->get_parameter(name_ + ".strafe_theta", strafe_theta_);
+  nh_->get_parameter(name_ + ".theta_scale", theta_scale_);
 }
 
 double PreferForwardCritic::scoreTrajectory(const dwb_msgs::msg::Trajectory2D & traj)
diff --git a/nav2_dwb_controller/dwb_critics/src/twirling.cpp b/nav2_dwb_controller/dwb_critics/src/twirling.cpp
index 979a8aa18515d3e4a0995df5d8eefc9ba4b04465..c203469356f43fb8c01caaca1c4213e8f43ab4c2 100644
--- a/nav2_dwb_controller/dwb_critics/src/twirling.cpp
+++ b/nav2_dwb_controller/dwb_critics/src/twirling.cpp
@@ -39,8 +39,10 @@ namespace dwb_critics
 {
 void TwirlingCritic::onInit()
 {
+  nh_->declare_parameter(name_ + ".scale", rclcpp::ParameterValue(0.0));
+
   // Scale is set to 0 by default, so if it was not set otherwise, set to 0
-  nh_->get_parameter_or(name_ + ".scale", scale_, 0.0);
+  nh_->get_parameter(name_ + ".scale", scale_);
 }
 
 double TwirlingCritic::scoreTrajectory(const dwb_msgs::msg::Trajectory2D & traj)
diff --git a/nav2_dwb_controller/dwb_plugins/src/kinematic_parameters.cpp b/nav2_dwb_controller/dwb_plugins/src/kinematic_parameters.cpp
index 9d76f9729efcb73d0329e5fc29ce699936ce3fb8..7dc382767eee29ed18b5f7c1c1020ef8d2a3327b 100644
--- a/nav2_dwb_controller/dwb_plugins/src/kinematic_parameters.cpp
+++ b/nav2_dwb_controller/dwb_plugins/src/kinematic_parameters.cpp
@@ -58,20 +58,35 @@ void KinematicParameters::initialize(const nav2_lifecycle::LifecycleNode::Shared
   moveDeprecatedParameter<double>(nh, "max_speed_xy", "max_trans_vel");
   moveDeprecatedParameter<double>(nh, "min_speed_theta", "min_rot_vel");
 
-  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);
+  nh->declare_parameter("min_vel_x", rclcpp::ParameterValue(0.0));
+  nh->declare_parameter("min_vel_y", rclcpp::ParameterValue(0.0));
+  nh->declare_parameter("max_vel_x", rclcpp::ParameterValue(0.0));
+  nh->declare_parameter("max_vel_y", rclcpp::ParameterValue(0.0));
+  nh->declare_parameter("max_vel_theta", rclcpp::ParameterValue(0.0));
+  nh->declare_parameter("min_speed_xy", rclcpp::ParameterValue(0.0));
+  nh->declare_parameter("max_speed_xy", rclcpp::ParameterValue(0.0));
+  nh->declare_parameter("min_speed_theta", rclcpp::ParameterValue(0.0));
+  nh->declare_parameter("acc_lim_x", rclcpp::ParameterValue(0.0));
+  nh->declare_parameter("acc_lim_y", rclcpp::ParameterValue(0.0));
+  nh->declare_parameter("acc_lim_theta", rclcpp::ParameterValue(0.0));
+  nh->declare_parameter("decel_lim_x", rclcpp::ParameterValue(0.0));
+  nh->declare_parameter("decel_lim_y", rclcpp::ParameterValue(0.0));
+  nh->declare_parameter("decel_lim_theta", rclcpp::ParameterValue(0.0));
+
+  nh->get_parameter("min_vel_x", min_vel_x_);
+  nh->get_parameter("min_vel_y", min_vel_y_);
+  nh->get_parameter("max_vel_x", max_vel_x_);
+  nh->get_parameter("max_vel_y", max_vel_y_);
+  nh->get_parameter("max_vel_theta", max_vel_theta_);
+  nh->get_parameter("min_speed_xy", min_speed_xy_);
+  nh->get_parameter("max_speed_xy", max_speed_xy_);
+  nh->get_parameter("min_speed_theta", min_speed_theta_);
+  nh->get_parameter("acc_lim_x", acc_lim_x_);
+  nh->get_parameter("acc_lim_y", acc_lim_y_);
+  nh->get_parameter("acc_lim_theta", acc_lim_theta_);
+  nh->get_parameter("decel_lim_x", decel_lim_x_);
+  nh->get_parameter("decel_lim_y", decel_lim_y_);
+  nh->get_parameter("decel_lim_theta", decel_lim_theta_);
 
   min_speed_xy_sq_ = min_speed_xy_ * min_speed_xy_;
   max_speed_xy_sq_ = max_speed_xy_ * max_speed_xy_;
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 684d5a2a38ad3c70dd28fd320f22b1768635d221..25e8d3621e484ecaec76f44b51490ceb28936316 100644
--- a/nav2_dwb_controller/dwb_plugins/src/limited_accel_generator.cpp
+++ b/nav2_dwb_controller/dwb_plugins/src/limited_accel_generator.cpp
@@ -46,6 +46,9 @@ namespace dwb_plugins
 void LimitedAccelGenerator::initialize(const nav2_lifecycle::LifecycleNode::SharedPtr & nh)
 {
   StandardTrajectoryGenerator::initialize(nh);
+
+  nh->declare_parameter("sim_period");
+
   if (nh->get_parameter("sim_period", acceleration_time_)) {
   } else {
     double controller_frequency = nav_2d_utils::searchAndGetParam(
@@ -64,7 +67,7 @@ void LimitedAccelGenerator::initialize(const nav2_lifecycle::LifecycleNode::Shar
 void LimitedAccelGenerator::checkUseDwaParam(const nav2_lifecycle::LifecycleNode::SharedPtr & nh)
 {
   bool use_dwa;
-  nh->get_parameter_or("use_dwa", use_dwa, true);
+  nh->get_parameter("use_dwa", use_dwa);
   if (!use_dwa) {
     throw nav_core2::PlannerException("Deprecated parameter use_dwa set to false. "
             "Please use StandardTrajectoryGenerator for that functionality.");
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 a4cc85c84daa17fbec03671201f93b62ca9a8b17..da95a820c04ad70900a57d2bf3fa4117fb17c713 100644
--- a/nav2_dwb_controller/dwb_plugins/src/simple_goal_checker.cpp
+++ b/nav2_dwb_controller/dwb_plugins/src/simple_goal_checker.cpp
@@ -47,8 +47,12 @@ SimpleGoalChecker::SimpleGoalChecker()
 
 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);
+  nh->declare_parameter("xy_goal_tolerance", rclcpp::ParameterValue(0.25));
+  nh->declare_parameter("yaw_goal_tolerance", rclcpp::ParameterValue(0.25));
+
+  nh->get_parameter("xy_goal_tolerance", xy_goal_tolerance_);
+  nh->get_parameter("yaw_goal_tolerance", yaw_goal_tolerance_);
+
   xy_goal_tolerance_sq_ = xy_goal_tolerance_ * xy_goal_tolerance_;
 }
 
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 b168e2db6f2f402c91fe2614a5ee994d6b85baf0..efeb6f8f20cdaa87e12e8073847894865a6e40fd 100644
--- a/nav2_dwb_controller/dwb_plugins/src/standard_traj_generator.cpp
+++ b/nav2_dwb_controller/dwb_plugins/src/standard_traj_generator.cpp
@@ -54,7 +54,10 @@ void StandardTrajectoryGenerator::initialize(const nav2_lifecycle::LifecycleNode
   kinematics_->initialize(nh);
   initializeIterator(nh);
 
-  nh->get_parameter_or("sim_time", sim_time_, 1.7);
+  nh->declare_parameter("sim_time", rclcpp::ParameterValue(1.7));
+  nh->declare_parameter("discretize_by_time", rclcpp::ParameterValue(false));
+
+  nh->get_parameter("sim_time", sim_time_);
   checkUseDwaParam(nh);
 
   /*
@@ -65,7 +68,7 @@ void StandardTrajectoryGenerator::initialize(const nav2_lifecycle::LifecycleNode
    *  two successive points on the trajectory, and angular_sim_granularity is the maximum amount of
    *  angular distance between two successive points.
    */
-  nh->get_parameter_or("discretize_by_time", discretize_by_time_, false);
+  nh->get_parameter("discretize_by_time", discretize_by_time_);
   if (discretize_by_time_) {
     time_granularity_ = loadParameterWithDeprecation(
       nh, "time_granularity", "sim_granularity", 0.5);
@@ -88,7 +91,7 @@ void StandardTrajectoryGenerator::checkUseDwaParam(
   const nav2_lifecycle::LifecycleNode::SharedPtr & nh)
 {
   bool use_dwa;
-  nh->get_parameter_or("use_dwa", use_dwa, false);
+  nh->get_parameter("use_dwa", use_dwa);
   if (use_dwa) {
     throw nav_core2::PlannerException("Deprecated parameter use_dwa set to true. "
             "Please use LimitedAccelGenerator for that functionality.");
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 9a1af7acfd0c2e170ff104e4d179972474d19a65..d32c8dfad8797a79a59816da742420bc20a29202 100644
--- a/nav2_dwb_controller/dwb_plugins/src/stopped_goal_checker.cpp
+++ b/nav2_dwb_controller/dwb_plugins/src/stopped_goal_checker.cpp
@@ -50,8 +50,12 @@ StoppedGoalChecker::StoppedGoalChecker()
 void StoppedGoalChecker::initialize(const nav2_lifecycle::LifecycleNode::SharedPtr & nh)
 {
   SimpleGoalChecker::initialize(nh);
-  nh->get_parameter_or("rot_stopped_velocity", rot_stopped_velocity_, 0.25);
-  nh->get_parameter_or("trans_stopped_velocity", trans_stopped_velocity_, 0.25);
+
+  nh->declare_parameter("rot_stopped_velocity", rclcpp::ParameterValue(0.25));
+  nh->declare_parameter("trans_stopped_velocity", rclcpp::ParameterValue(0.25));
+
+  nh->get_parameter("rot_stopped_velocity", rot_stopped_velocity_);
+  nh->get_parameter("trans_stopped_velocity", trans_stopped_velocity_);
 }
 
 bool StoppedGoalChecker::isGoalReached(
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 1e20e770bfca97366171c8a666e66ace3017d692..ee039a7ef3af933528a6a7654d0114741eb7bbfb 100644
--- a/nav2_dwb_controller/dwb_plugins/src/xy_theta_iterator.cpp
+++ b/nav2_dwb_controller/dwb_plugins/src/xy_theta_iterator.cpp
@@ -43,8 +43,13 @@ void XYThetaIterator::initialize(
   KinematicParameters::Ptr kinematics)
 {
   kinematics_ = kinematics;
-  nh->get_parameter_or("vx_samples", vx_samples_, 20);
-  nh->get_parameter_or("vy_samples", vy_samples_, 5);
+
+  nh->declare_parameter("vx_samples", rclcpp::ParameterValue(20));
+  nh->declare_parameter("vy_samples", rclcpp::ParameterValue(5));
+
+  nh->get_parameter("vx_samples", vx_samples_);
+  nh->get_parameter("vy_samples", vy_samples_);
+
   vtheta_samples_ = nav_2d_utils::loadParameterWithDeprecation(nh, "vtheta_samples", "vth_samples",
       20);
 }
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 da1f01fd4b17c6175c4fb01fae11180b433c8893..84785cdb43ec5e6c38c5416622bdf8d342b5033f 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
@@ -67,6 +67,7 @@ public:
     nh.get_parameter_or("odom_topic", odom_topic, default_topic);
     odom_sub_ =
       nh.create_subscription<nav_msgs::msg::Odometry>(odom_topic,
+        rclcpp::SystemDefaultsQoS(),
         std::bind(&OdomSubscriber::odomCallback, this, std::placeholders::_1));
 
     nh.get_parameter_or("min_x_velocity_threshold", min_x_velocity_threshold_, 0.0001);