diff --git a/include/ibm/management_console_rest.hpp b/include/ibm/management_console_rest.hpp
index 3038916..af87b76 100644
--- a/include/ibm/management_console_rest.hpp
+++ b/include/ibm/management_console_rest.hpp
@@ -6,8 +6,10 @@
 #include <boost/algorithm/string.hpp>
 #include <boost/container/flat_set.hpp>
 #include <error_messages.hpp>
+#include <event_service_manager.hpp>
 #include <ibm/locks.hpp>
 #include <nlohmann/json.hpp>
+#include <resource_messages.hpp>
 #include <sdbusplus/message/types.hpp>
 #include <utils/json_utils.hpp>
 
@@ -30,6 +32,7 @@
 {
 namespace ibm_mc
 {
+using namespace redfish;
 constexpr const char* methodNotAllowedMsg = "Method Not Allowed";
 constexpr const char* resourceNotFoundMsg = "Resource Not Found";
 constexpr const char* contentNotAcceptableMsg = "Content Not Acceptable";
@@ -127,6 +130,10 @@
         file << data;
         BMCWEB_LOG_DEBUG << "save-area file is created";
         res.jsonValue["Description"] = "File Created";
+        // Push an event
+        std::string origin = "/ibm/v1/Host/ConfigFiles/" + fileID;
+        redfish::EventServiceManager::getInstance().sendEvent(
+            redfish::messages::ResourceCreated(), origin, "IBMConfigFile");
     }
 }
 
diff --git a/redfish-core/include/event_service_manager.hpp b/redfish-core/include/event_service_manager.hpp
index 451816e..0a9b022 100644
--- a/redfish-core/include/event_service_manager.hpp
+++ b/redfish-core/include/event_service_manager.hpp
@@ -412,6 +412,7 @@
             }
             conn->setHeaders(reqHeaders);
             conn->sendData(msg);
+            this->eventSeqNum++;
         }
 
         if (sseConn != nullptr)
@@ -441,7 +442,6 @@
                               {"Events", logEntryArray}};
 
         this->sendEvent(msg.dump());
-        this->eventSeqNum++;
     }
 
 #ifndef BMCWEB_ENABLE_REDFISH_DBUS_LOG_ENTRIES
@@ -505,7 +505,6 @@
                               {"Events", logEntryArray}};
 
         this->sendEvent(msg.dump());
-        this->eventSeqNum++;
     }
 #endif
 
@@ -568,6 +567,11 @@
         }
     }
 
+    uint64_t getEventSeqNum()
+    {
+        return eventSeqNum;
+    }
+
   private:
     uint64_t eventSeqNum;
     std::string host;
@@ -598,7 +602,7 @@
     EventServiceManager& operator=(EventServiceManager&&) = delete;
 
     EventServiceManager() :
-        noOfEventLogSubscribers(0), noOfMetricReportSubscribers(0)
+        noOfEventLogSubscribers(0), noOfMetricReportSubscribers(0), eventId(1)
     {
         // Load config from persist store.
         initConfig();
@@ -611,6 +615,8 @@
     boost::container::flat_map<std::string, std::shared_ptr<Subscription>>
         subscriptionsMap;
 
+    uint64_t eventId;
+
   public:
     static EventServiceManager& getInstance()
     {
@@ -1018,6 +1024,67 @@
         }
     }
 
+    void sendEvent(const nlohmann::json& eventMessageIn,
+                   const std::string& origin, const std::string& resType)
+    {
+        nlohmann::json eventRecord = nlohmann::json::array();
+        nlohmann::json eventMessage = eventMessageIn;
+        // MemberId is 0 : since we are sending one event record.
+        uint64_t memberId = 0;
+
+        nlohmann::json event = {
+            {"EventId", eventId},
+            {"MemberId", memberId},
+            {"EventTimestamp", crow::utility::dateTimeNow()},
+            {"OriginOfCondition", origin}};
+        for (nlohmann::json::iterator it = event.begin(); it != event.end();
+             ++it)
+        {
+            eventMessage[it.key()] = it.value();
+        }
+        eventRecord.push_back(eventMessage);
+
+        for (const auto& it : this->subscriptionsMap)
+        {
+            std::shared_ptr<Subscription> entry = it.second;
+            bool isSubscribed = false;
+            // Search the resourceTypes list for the subscription.
+            // If resourceTypes list is empty, don't filter events
+            // send everything.
+            if (entry->resourceTypes.size())
+            {
+                for (auto resource : entry->resourceTypes)
+                {
+                    if (resType == resource)
+                    {
+                        BMCWEB_LOG_INFO << "ResourceType " << resource
+                                        << " found in the subscribed list";
+                        isSubscribed = true;
+                        break;
+                    }
+                }
+            }
+            else // resourceTypes list is empty.
+            {
+                isSubscribed = true;
+            }
+            if (isSubscribed)
+            {
+                nlohmann::json msgJson = {
+                    {"@odata.type", "#Event.v1_4_0.Event"},
+                    {"Name", "Event Log"},
+                    {"Id", eventId},
+                    {"Events", eventRecord}};
+                entry->sendEvent(msgJson.dump());
+                eventId++; // increament the eventId
+            }
+            else
+            {
+                BMCWEB_LOG_INFO << "Not subscribed to this resource";
+            }
+        }
+    }
+
 #ifndef BMCWEB_ENABLE_REDFISH_DBUS_LOG_ENTRIES
     void cacheLastEventTimestamp()
     {
