diff --git a/redfish-core/include/event_service_manager.hpp b/redfish-core/include/event_service_manager.hpp
index 9f67c08..3f5c1ee 100644
--- a/redfish-core/include/event_service_manager.hpp
+++ b/redfish-core/include/event_service_manager.hpp
@@ -48,9 +48,6 @@
 static constexpr const char* eventFormatType = "Event";
 static constexpr const char* metricReportFormatType = "MetricReport";
 
-static constexpr const char* eventServiceFile =
-    "/var/lib/bmcweb/eventservice_config.json";
-
 class EventServiceManager
 {
   private:
@@ -98,8 +95,6 @@
 
     void initConfig()
     {
-        loadOldBehavior();
-
         persistent_data::EventServiceConfig eventServiceConfig =
             persistent_data::EventServiceStore::getInstance()
                 .getEventServiceConfig();
@@ -145,105 +140,6 @@
         }
     }
 
-    static void loadOldBehavior()
-    {
-        std::ifstream eventConfigFile(eventServiceFile);
-        if (!eventConfigFile.good())
-        {
-            BMCWEB_LOG_DEBUG("Old eventService config not exist");
-            return;
-        }
-        auto jsonData = nlohmann::json::parse(eventConfigFile, nullptr, false);
-        if (jsonData.is_discarded())
-        {
-            BMCWEB_LOG_ERROR("Old eventService config parse error.");
-            return;
-        }
-
-        const nlohmann::json::object_t* obj =
-            jsonData.get_ptr<const nlohmann::json::object_t*>();
-        if (obj == nullptr)
-        {
-            return;
-        }
-        for (const auto& item : *obj)
-        {
-            if (item.first == "Configuration")
-            {
-                persistent_data::EventServiceStore::getInstance()
-                    .getEventServiceConfig()
-                    .fromJson(item.second);
-            }
-            else if (item.first == "Subscriptions")
-            {
-                for (const auto& elem : item.second)
-                {
-                    std::optional<persistent_data::UserSubscription>
-                        newSubscription =
-                            persistent_data::UserSubscription::fromJson(elem,
-                                                                        true);
-                    if (!newSubscription)
-                    {
-                        BMCWEB_LOG_ERROR("Problem reading subscription "
-                                         "from old persistent store");
-                        continue;
-                    }
-                    persistent_data::UserSubscription& newSub =
-                        *newSubscription;
-
-                    std::uniform_int_distribution<uint32_t> dist(0);
-                    bmcweb::OpenSSLGenerator gen;
-
-                    std::string id;
-
-                    int retry = 3;
-                    while (retry != 0)
-                    {
-                        id = std::to_string(dist(gen));
-                        if (gen.error())
-                        {
-                            retry = 0;
-                            break;
-                        }
-                        newSub.id = id;
-                        auto inserted =
-                            persistent_data::EventServiceStore::getInstance()
-                                .subscriptionsConfigMap.insert(std::pair(
-                                    id, std::make_shared<
-                                            persistent_data::UserSubscription>(
-                                            newSub)));
-                        if (inserted.second)
-                        {
-                            break;
-                        }
-                        --retry;
-                    }
-
-                    if (retry <= 0)
-                    {
-                        BMCWEB_LOG_ERROR(
-                            "Failed to generate random number from old "
-                            "persistent store");
-                        continue;
-                    }
-                }
-            }
-
-            persistent_data::getConfig().writeData();
-            std::error_code ec;
-            std::filesystem::remove(eventServiceFile, ec);
-            if (ec)
-            {
-                BMCWEB_LOG_DEBUG(
-                    "Failed to remove old event service file.  Ignoring");
-            }
-            else
-            {
-                BMCWEB_LOG_DEBUG("Remove old eventservice config");
-            }
-        }
-    }
-
     void updateSubscriptionData() const
     {
         persistent_data::EventServiceStore::getInstance()
