diff --git a/redfish-core/include/task_messages.hpp b/redfish-core/include/task_messages.hpp
index ed16e09..36d4721 100644
--- a/redfish-core/include/task_messages.hpp
+++ b/redfish-core/include/task_messages.hpp
@@ -1,94 +1,49 @@
-/*
-Copyright (c) 2020 Intel Corporation
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
 #pragma once
-#include "registries/task_event_message_registry.hpp"
+/****************************************************************
+ *                 READ THIS WARNING FIRST
+ * This is an auto-generated header which contains definitions
+ * for Redfish DMTF defined messages.
+ * DO NOT modify this registry outside of running the
+ * parse_registries.py script.  The definitions contained within
+ * this file are owned by DMTF.  Any modifications to these files
+ * should be first pushed to the relevant registry in the DMTF
+ * github organization.
+ ***************************************************************/
 
+#include "http_response.hpp"
+
+#include <boost/url/url_view_base.hpp>
 #include <nlohmann/json.hpp>
 
-#include <array>
-namespace redfish::messages
+#include <cstdint>
+#include <source_location>
+#include <string>
+#include <string_view>
+
+// IWYU pragma: no_forward_declare crow::Response
+
+namespace redfish
 {
 
-inline nlohmann::json
-    getLogTaskEvent(redfish::registries::task_event::Index name,
-                    std::span<const std::string_view> args)
+namespace messages
 {
-    size_t index = static_cast<size_t>(name);
-    if (index >= redfish::registries::task_event::registry.size())
-    {
-        return {};
-    }
-    return getLogFromRegistry(redfish::registries::task_event::header,
-                              redfish::registries::task_event::registry, index,
-                              args);
-}
+nlohmann::json taskStarted(std::string_view arg1);
 
-inline nlohmann::json taskAborted(std::string_view arg1)
-{
-    return getLogTaskEvent(registries::task_event::Index::taskAborted,
-                           std::to_array({arg1}));
-}
+nlohmann::json taskCompletedOK(std::string_view arg1);
 
-inline nlohmann::json taskCancelled(std::string_view arg1)
-{
-    return getLogTaskEvent(registries::task_event::Index::taskCancelled,
-                           std::to_array({arg1}));
-}
+nlohmann::json taskCompletedWarning(std::string_view arg1);
 
-inline nlohmann::json taskCompletedOK(std::string_view arg1)
-{
-    return getLogTaskEvent(registries::task_event::Index::taskCompletedOK,
-                           std::to_array({arg1}));
-}
+nlohmann::json taskAborted(std::string_view arg1);
 
-inline nlohmann::json taskCompletedWarning(std::string_view arg1)
-{
-    return getLogTaskEvent(registries::task_event::Index::taskCompletedWarning,
-                           std::to_array({arg1}));
-}
+nlohmann::json taskCancelled(std::string_view arg1);
 
-inline nlohmann::json taskPaused(std::string_view arg1)
-{
-    return getLogTaskEvent(registries::task_event::Index::taskPaused,
-                           std::to_array({arg1}));
-}
+nlohmann::json taskRemoved(std::string_view arg1);
 
-inline nlohmann::json taskProgressChanged(std::string_view arg1, size_t arg2)
-{
-    std::string arg2Str = std::to_string(arg2);
-    return getLogTaskEvent(registries::task_event::Index::taskProgressChanged,
-                           std::to_array<std::string_view>({arg1, arg2Str}));
-}
+nlohmann::json taskPaused(std::string_view arg1);
 
-inline nlohmann::json taskRemoved(std::string_view arg1)
-{
-    return getLogTaskEvent(registries::task_event::Index::taskRemoved,
-                           std::to_array({arg1}));
-}
+nlohmann::json taskResumed(std::string_view arg1);
 
-inline nlohmann::json taskResumed(std::string_view arg1)
-{
-    return getLogTaskEvent(registries::task_event::Index::taskResumed,
-                           std::to_array({arg1}));
-}
+nlohmann::json taskProgressChanged(std::string_view arg1, uint64_t arg2);
 
-inline nlohmann::json taskStarted(std::string_view arg1)
-{
-    return getLogTaskEvent(registries::task_event::Index::taskStarted,
-                           std::to_array({arg1}));
-}
-
-} // namespace redfish::messages
+} // namespace messages
+} // namespace redfish
