diff --git a/redfish-core/include/event_service_manager.hpp b/redfish-core/include/event_service_manager.hpp
index 148c703..34af41a 100644
--- a/redfish-core/include/event_service_manager.hpp
+++ b/redfish-core/include/event_service_manager.hpp
@@ -18,6 +18,7 @@
 #include "registries.hpp"
 #include "registries/base_message_registry.hpp"
 #include "registries/openbmc_message_registry.hpp"
+#include "registries/task_event_message_registry.hpp"
 
 #include <sys/inotify.h>
 
@@ -64,6 +65,24 @@
 
 namespace message_registries
 {
+inline boost::beast::span<const MessageEntry>
+    getRegistryFromPrefix(const std::string& registryName)
+{
+    if (task_event::header.registryPrefix == registryName)
+    {
+        return boost::beast::span<const MessageEntry>(task_event::registry);
+    }
+    if (openbmc::header.registryPrefix == registryName)
+    {
+        return boost::beast::span<const MessageEntry>(openbmc::registry);
+    }
+    if (base::header.registryPrefix == registryName)
+    {
+        return boost::beast::span<const MessageEntry>(base::registry);
+    }
+    return boost::beast::span<const MessageEntry>(openbmc::registry);
+}
+
 static const Message*
     getMsgFromRegistry(const std::string& messageKey,
                        const boost::beast::span<const MessageEntry>& registry)
@@ -97,18 +116,7 @@
     std::string& messageKey = fields[3];
 
     // Find the right registry and check it for the MessageKey
-    if (std::string(base::header.registryPrefix) == registryName)
-    {
-        return getMsgFromRegistry(
-            messageKey, boost::beast::span<const MessageEntry>(base::registry));
-    }
-    if (std::string(openbmc::header.registryPrefix) == registryName)
-    {
-        return getMsgFromRegistry(
-            messageKey,
-            boost::beast::span<const MessageEntry>(openbmc::registry));
-    }
-    return nullptr;
+    return getMsgFromRegistry(messageKey, getRegistryFromPrefix(registryName));
 }
 } // namespace message_registries
 
diff --git a/redfish-core/lib/event_service.hpp b/redfish-core/lib/event_service.hpp
index ad567ef..64a2009 100644
--- a/redfish-core/lib/event_service.hpp
+++ b/redfish-core/lib/event_service.hpp
@@ -22,7 +22,7 @@
 static constexpr const std::array<const char*, 2> supportedEvtFormatTypes = {
     eventFormatType, metricReportFormatType};
 static constexpr const std::array<const char*, 3> supportedRegPrefixes = {
-    "Base", "OpenBMC", "Task"};
+    "Base", "OpenBMC", "TaskEvent"};
 static constexpr const std::array<const char*, 3> supportedRetryPolicies = {
     "TerminateAfterRetries", "SuspendRetries", "RetryForever"};
 
@@ -397,8 +397,54 @@
 
         if (msgIds)
         {
-            // Do we need to loop-up MessageRegistry and validate
-            // data for authenticity??? Not mandate, i believe.
+            std::vector<std::string> registryPrefix;
+
+            // If no registry prefixes are mentioned, consider all supported
+            // prefixes
+            if (subValue->registryPrefixes.empty())
+            {
+                registryPrefix.assign(supportedRegPrefixes.begin(),
+                                      supportedRegPrefixes.end());
+            }
+            else
+            {
+                registryPrefix = subValue->registryPrefixes;
+            }
+
+            for (const std::string& id : *msgIds)
+            {
+                bool validId = false;
+
+                // Check for Message ID in each of the selected Registry
+                for (const std::string& it : registryPrefix)
+                {
+                    const boost::beast::span<
+                        const redfish::message_registries::MessageEntry>
+                        registry =
+                            redfish::message_registries::getRegistryFromPrefix(
+                                it);
+
+                    if (std::any_of(
+                            registry.cbegin(), registry.cend(),
+                            [&id](
+                                const redfish::message_registries::MessageEntry&
+                                    messageEntry) {
+                                return !id.compare(messageEntry.first);
+                            }))
+                    {
+                        validId = true;
+                        break;
+                    }
+                }
+
+                if (!validId)
+                {
+                    messages::propertyValueNotInList(asyncResp->res, id,
+                                                     "MessageIds");
+                    return;
+                }
+            }
+
             subValue->registryMsgIds = *msgIds;
         }
 
