diff --git a/http/http_client.hpp b/http/http_client.hpp
index 546d92c..b48fc6a 100644
--- a/http/http_client.hpp
+++ b/http/http_client.hpp
@@ -841,6 +841,27 @@
         // Initialize the pool with a single connection
         addConnection();
     }
+
+    // Check whether all connections are terminated
+    bool areAllConnectionsTerminated()
+    {
+        if (connections.empty())
+        {
+            BMCWEB_LOG_DEBUG("There are no connections for pool id:{}", id);
+            return false;
+        }
+        for (const auto& conn : connections)
+        {
+            if (conn != nullptr && conn->state != ConnState::terminated)
+            {
+                BMCWEB_LOG_DEBUG(
+                    "Not all connections of pool id:{} are terminated", id);
+                return false;
+            }
+        }
+        BMCWEB_LOG_INFO("All connections of pool id:{} are terminated", id);
+        return true;
+    }
 };
 
 class HttpClient
@@ -914,5 +935,22 @@
         pool.first->second->sendData(std::move(data), destUrl, httpHeader, verb,
                                      resHandler);
     }
+
+    // Test whether all connections are terminated (after MaxRetryAttempts)
+    bool isTerminated()
+    {
+        for (const auto& pool : connectionPools)
+        {
+            if (pool.second != nullptr &&
+                !pool.second->areAllConnectionsTerminated())
+            {
+                BMCWEB_LOG_DEBUG(
+                    "Not all of client connections are terminated");
+                return false;
+            }
+        }
+        BMCWEB_LOG_DEBUG("All client connections are terminated");
+        return true;
+    }
 };
 } // namespace crow
diff --git a/redfish-core/include/event_service_manager.hpp b/redfish-core/include/event_service_manager.hpp
index 7c20e10..66e92d5 100644
--- a/redfish-core/include/event_service_manager.hpp
+++ b/redfish-core/include/event_service_manager.hpp
@@ -252,7 +252,7 @@
 
 } // namespace event_log
 
-class Subscription
+class Subscription : public std::enable_shared_from_this<Subscription>
 {
   public:
     Subscription(const Subscription&) = delete;
@@ -277,6 +277,36 @@
 
     ~Subscription() = default;
 
+    // callback for subscription sendData
+    void resHandler(const std::shared_ptr<Subscription>& /*unused*/,
+                    const crow::Response& res)
+    {
+        BMCWEB_LOG_DEBUG("Response handled with return code: {}",
+                         res.resultInt());
+
+        if (!client)
+        {
+            BMCWEB_LOG_ERROR(
+                "Http client wasn't filled but http client callback was called.");
+            return;
+        }
+
+        if (userSub.retryPolicy != "TerminateAfterRetries")
+        {
+            return;
+        }
+        if (client->isTerminated())
+        {
+            if (deleter)
+            {
+                BMCWEB_LOG_INFO(
+                    "Subscription {} is deleted after MaxRetryAttempts",
+                    userSub.id);
+                deleter();
+            }
+        }
+    }
+
     bool sendEventToSubscriber(std::string&& msg)
     {
         persistent_data::EventServiceConfig eventServiceConfig =
@@ -289,11 +319,13 @@
 
         if (client)
         {
-            client->sendData(std::move(msg), userSub.destinationUrl,
-                             static_cast<ensuressl::VerifyCertificate>(
-                                 userSub.verifyCertificate),
-                             userSub.httpHeaders,
-                             boost::beast::http::verb::post);
+            client->sendDataWithCallback(
+                std::move(msg), userSub.destinationUrl,
+                static_cast<ensuressl::VerifyCertificate>(
+                    userSub.verifyCertificate),
+                userSub.httpHeaders, boost::beast::http::verb::post,
+                std::bind_front(&Subscription::resHandler, this,
+                                shared_from_this()));
             return true;
         }
 
@@ -476,6 +508,7 @@
     }
 
     persistent_data::UserSubscription userSub;
+    std::function<void()> deleter;
 
   private:
     uint64_t eventSeqNum = 1;
@@ -564,8 +597,12 @@
             }
             std::shared_ptr<Subscription> subValue =
                 std::make_shared<Subscription>(newSub, *url, ioc);
+            std::string id = subValue->userSub.id;
+            subValue->deleter = [id]() {
+                EventServiceManager::getInstance().deleteSubscription(id);
+            };
 
-            subscriptionsMap.insert(std::pair(subValue->userSub.id, subValue));
+            subscriptionsMap.emplace(id, subValue);
 
             updateNoOfSubscribersCount();
 
@@ -875,7 +912,9 @@
         addPushSubscription(const std::shared_ptr<Subscription>& subValue)
     {
         std::string id = addSubscriptionInternal(subValue);
-
+        subValue->deleter = [id]() {
+            EventServiceManager::getInstance().deleteSubscription(id);
+        };
         updateSubscriptionData();
         return id;
     }
