diff --git a/nav2_map_server/src/map_saver/map_saver.cpp b/nav2_map_server/src/map_saver/map_saver.cpp
index 0cd5280963afe66633d56f332c52918fe78b5333..18be433e795bf5de655f56f639f38693dd798aec 100644
--- a/nav2_map_server/src/map_saver/map_saver.cpp
+++ b/nav2_map_server/src/map_saver/map_saver.cpp
@@ -35,6 +35,7 @@
 #include <memory>
 #include <stdexcept>
 #include <functional>
+#include <mutex>
 
 using namespace std::placeholders;
 
@@ -99,6 +100,9 @@ nav2_util::CallbackReturn
 MapSaver::on_cleanup(const rclcpp_lifecycle::State & /*state*/)
 {
   RCLCPP_INFO(get_logger(), "Cleaning up");
+
+  save_map_service_.reset();
+
   return nav2_util::CallbackReturn::SUCCESS;
 }
 
@@ -148,6 +152,9 @@ bool MapSaver::saveMapTopicToFile(
     // Pointer to map message received in the subscription callback
     nav_msgs::msg::OccupancyGrid::SharedPtr map_msg = nullptr;
 
+    // Mutex for handling map_msg shared resource
+    std::recursive_mutex access;
+
     // Correct map_topic_loc if necessary
     if (map_topic_loc == "") {
       map_topic_loc = "map";
@@ -173,8 +180,9 @@ bool MapSaver::saveMapTopicToFile(
     }
 
     // A callback function that receives map message from subscribed topic
-    auto mapCallback = [&map_msg](
+    auto mapCallback = [&map_msg, &access](
       const nav_msgs::msg::OccupancyGrid::SharedPtr msg) -> void {
+        std::lock_guard<std::recursive_mutex> guard(access);
         map_msg = msg;
       };
 
@@ -198,6 +206,9 @@ bool MapSaver::saveMapTopicToFile(
       }
 
       if (map_msg) {
+        std::lock_guard<std::recursive_mutex> guard(access);
+        // map_sub is no more needed
+        map_sub.reset();
         // Map message received. Saving it to file
         if (saveMapToFile(*map_msg, save_parameters_loc)) {
           RCLCPP_INFO(get_logger(), "Map saved successfully");
diff --git a/nav2_map_server/test/component/test_map_saver_publisher.cpp b/nav2_map_server/test/component/test_map_saver_publisher.cpp
index 50d66b0a5e466e15037bb7152145b1a5ca91a392..70f450523e96cbaddec50f1e2bad5ac15f9ca7ec 100644
--- a/nav2_map_server/test/component/test_map_saver_publisher.cpp
+++ b/nav2_map_server/test/component/test_map_saver_publisher.cpp
@@ -15,7 +15,6 @@
 #include <experimental/filesystem>
 #include <string>
 #include <memory>
-#include <chrono>
 
 #include "rclcpp/rclcpp.hpp"
 #include "nav2_map_server/map_io.hpp"
@@ -23,7 +22,6 @@
 
 #define TEST_DIR TEST_DIRECTORY
 
-using namespace std::chrono_literals;
 using namespace nav2_map_server;  // NOLINT
 using std::experimental::filesystem::path;
 
@@ -34,7 +32,8 @@ public:
   : Node("map_publisher")
   {
     std::string pub_map_file = path(TEST_DIR) / path(g_valid_yaml_file);
-    LOAD_MAP_STATUS status = loadMapFromYaml(pub_map_file, msg_);
+    nav_msgs::msg::OccupancyGrid msg;
+    LOAD_MAP_STATUS status = loadMapFromYaml(pub_map_file, msg);
     if (status != LOAD_MAP_SUCCESS) {
       RCLCPP_ERROR(get_logger(), "Can not load %s map file", pub_map_file);
       return;
@@ -43,19 +42,11 @@ public:
     map_pub_ = create_publisher<nav_msgs::msg::OccupancyGrid>(
       "map",
       rclcpp::QoS(rclcpp::KeepLast(1)).transient_local().reliable());
-
-    timer_ = create_wall_timer(300ms, std::bind(&TestPublisher::mapPublishCallback, this));
+    map_pub_->publish(msg);
   }
 
 protected:
-  void mapPublishCallback()
-  {
-    map_pub_->publish(msg_);
-  }
-
   rclcpp::Publisher<nav_msgs::msg::OccupancyGrid>::SharedPtr map_pub_;
-  rclcpp::TimerBase::SharedPtr timer_;
-  nav_msgs::msg::OccupancyGrid msg_;
 };
 
 int main(int argc, char ** argv)
diff --git a/nav2_map_server/test/map_saver_params.yaml b/nav2_map_server/test/map_saver_params.yaml
index 25d6b88b2c7b6a2bd6452fd18fbc153c1dd708fb..458d3a1870b648b496dccca8aa9ab65aab3c6fc1 100644
--- a/nav2_map_server/test/map_saver_params.yaml
+++ b/nav2_map_server/test/map_saver_params.yaml
@@ -1,5 +1,5 @@
 map_saver:
     ros__parameters:
-        save_map_timeout: 1000
+        save_map_timeout: 5000
         free_thresh_default: 0.196
         occupied_thresh_default: 0.65