diff --git a/redfish-core/lib/message_registries.hpp b/redfish-core/lib/message_registries.hpp
index e3bd5bf..f770488 100644
--- a/redfish-core/lib/message_registries.hpp
+++ b/redfish-core/lib/message_registries.hpp
@@ -27,6 +27,26 @@
 namespace redfish
 {
 
+inline void handleMessageRegistryFileCollectionGet(
+    const crow::Request&, const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
+{
+    // Collections don't include the static data added by SubRoute
+    // because it has a duplicate entry for members
+
+    asyncResp->res.jsonValue = {
+        {"@odata.type", "#MessageRegistryFileCollection."
+                        "MessageRegistryFileCollection"},
+        {"@odata.id", "/redfish/v1/Registries"},
+        {"Name", "MessageRegistryFile Collection"},
+        {"Description", "Collection of MessageRegistryFiles"},
+        {"Members@odata.count", 4},
+        {"Members",
+         {{{"@odata.id", "/redfish/v1/Registries/Base"}},
+          {{"@odata.id", "/redfish/v1/Registries/TaskEvent"}},
+          {{"@odata.id", "/redfish/v1/Registries/ResourceEvent"}},
+          {{"@odata.id", "/redfish/v1/Registries/OpenBMC"}}}}};
+}
+
 inline void requestRoutesMessageRegistryFileCollection(App& app)
 {
     /**
@@ -35,24 +55,63 @@
     BMCWEB_ROUTE(app, "/redfish/v1/Registries/")
         .privileges(redfish::privileges::getMessageRegistryFileCollection)
         .methods(boost::beast::http::verb::get)(
-            [](const crow::Request&,
-               const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-                // Collections don't include the static data added by SubRoute
-                // because it has a duplicate entry for members
+            handleMessageRegistryFileCollectionGet);
+}
 
-                asyncResp->res.jsonValue = {
-                    {"@odata.type", "#MessageRegistryFileCollection."
-                                    "MessageRegistryFileCollection"},
-                    {"@odata.id", "/redfish/v1/Registries"},
-                    {"Name", "MessageRegistryFile Collection"},
-                    {"Description", "Collection of MessageRegistryFiles"},
-                    {"Members@odata.count", 4},
-                    {"Members",
-                     {{{"@odata.id", "/redfish/v1/Registries/Base"}},
-                      {{"@odata.id", "/redfish/v1/Registries/TaskEvent"}},
-                      {{"@odata.id", "/redfish/v1/Registries/ResourceEvent"}},
-                      {{"@odata.id", "/redfish/v1/Registries/OpenBMC"}}}}};
-            });
+inline void handleMessageRoutesMessageRegistryFileGet(
+    const crow::Request&, const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
+    const std::string& registry)
+{
+    const message_registries::Header* header;
+    std::string dmtf = "DMTF ";
+    const char* url = nullptr;
+
+    if (registry == "Base")
+    {
+        header = &message_registries::base::header;
+        url = message_registries::base::url;
+    }
+    else if (registry == "TaskEvent")
+    {
+        header = &message_registries::task_event::header;
+        url = message_registries::task_event::url;
+    }
+    else if (registry == "OpenBMC")
+    {
+        header = &message_registries::openbmc::header;
+        dmtf.clear();
+    }
+    else if (registry == "ResourceEvent")
+    {
+        header = &message_registries::resource_event::header;
+        url = message_registries::resource_event::url;
+    }
+    else
+    {
+        messages::resourceNotFound(
+            asyncResp->res, "#MessageRegistryFile.v1_1_0.MessageRegistryFile",
+            registry);
+        return;
+    }
+
+    asyncResp->res.jsonValue = {
+        {"@odata.id", "/redfish/v1/Registries/" + registry},
+        {"@odata.type", "#MessageRegistryFile.v1_1_0.MessageRegistryFile"},
+        {"Name", registry + " Message Registry File"},
+        {"Description", dmtf + registry + " Message Registry File Location"},
+        {"Id", header->registryPrefix},
+        {"Registry", header->id},
+        {"Languages", {"en"}},
+        {"Languages@odata.count", 1},
+        {"Location",
+         {{{"Language", "en"},
+           {"Uri", "/redfish/v1/Registries/" + registry + "/" + registry}}}},
+        {"Location@odata.count", 1}};
+
+    if (url != nullptr)
+    {
+        asyncResp->res.jsonValue["Location"][0]["PublicationUri"] = url;
+    }
 }
 
 inline void requestRoutesMessageRegistryFile(App& app)
@@ -60,172 +119,108 @@
     BMCWEB_ROUTE(app, "/redfish/v1/Registries/<str>/")
         .privileges(redfish::privileges::getMessageRegistryFile)
         .methods(boost::beast::http::verb::get)(
-            [](const crow::Request&,
-               const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
-               const std::string& registry) {
-                const message_registries::Header* header;
-                std::string dmtf = "DMTF ";
-                const char* url = nullptr;
+            handleMessageRoutesMessageRegistryFileGet);
+}
 
-                if (registry == "Base")
-                {
-                    header = &message_registries::base::header;
-                    url = message_registries::base::url;
-                }
-                else if (registry == "TaskEvent")
-                {
-                    header = &message_registries::task_event::header;
-                    url = message_registries::task_event::url;
-                }
-                else if (registry == "OpenBMC")
-                {
-                    header = &message_registries::openbmc::header;
-                    dmtf.clear();
-                }
-                else if (registry == "ResourceEvent")
-                {
-                    header = &message_registries::resource_event::header;
-                    url = message_registries::resource_event::url;
-                }
-                else
-                {
-                    messages::resourceNotFound(
-                        asyncResp->res,
-                        "#MessageRegistryFile.v1_1_0.MessageRegistryFile",
-                        registry);
-                    return;
-                }
+inline void handleMessageRegistryGet(
+    const crow::Request&, const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
+    const std::string& registry, const std::string& registry1)
 
-                asyncResp->res.jsonValue = {
-                    {"@odata.id", "/redfish/v1/Registries/" + registry},
-                    {"@odata.type",
-                     "#MessageRegistryFile.v1_1_0.MessageRegistryFile"},
-                    {"Name", registry + " Message Registry File"},
-                    {"Description",
-                     dmtf + registry + " Message Registry File Location"},
-                    {"Id", header->registryPrefix},
-                    {"Registry", header->id},
-                    {"Languages", {"en"}},
-                    {"Languages@odata.count", 1},
-                    {"Location",
-                     {{{"Language", "en"},
-                       {"Uri", "/redfish/v1/Registries/" + registry + "/" +
-                                   registry}}}},
-                    {"Location@odata.count", 1}};
+{
+    const message_registries::Header* header;
+    std::vector<const message_registries::MessageEntry*> registryEntries;
+    if (registry == "Base")
+    {
+        header = &message_registries::base::header;
+        for (const message_registries::MessageEntry& entry :
+             message_registries::base::registry)
+        {
+            registryEntries.emplace_back(&entry);
+        }
+    }
+    else if (registry == "TaskEvent")
+    {
+        header = &message_registries::task_event::header;
+        for (const message_registries::MessageEntry& entry :
+             message_registries::task_event::registry)
+        {
+            registryEntries.emplace_back(&entry);
+        }
+    }
+    else if (registry == "OpenBMC")
+    {
+        header = &message_registries::openbmc::header;
+        for (const message_registries::MessageEntry& entry :
+             message_registries::openbmc::registry)
+        {
+            registryEntries.emplace_back(&entry);
+        }
+    }
+    else if (registry == "ResourceEvent")
+    {
+        header = &message_registries::resource_event::header;
+        for (const message_registries::MessageEntry& entry :
+             message_registries::resource_event::registry)
+        {
+            registryEntries.emplace_back(&entry);
+        }
+    }
+    else
+    {
+        messages::resourceNotFound(
+            asyncResp->res, "#MessageRegistryFile.v1_1_0.MessageRegistryFile",
+            registry);
+        return;
+    }
 
-                if (url != nullptr)
+    if (registry != registry1)
+    {
+        messages::resourceNotFound(asyncResp->res, header->type, registry1);
+        return;
+    }
+
+    asyncResp->res.jsonValue = {{"@Redfish.Copyright", header->copyright},
+                                {"@odata.type", header->type},
+                                {"Id", header->id},
+                                {"Name", header->name},
+                                {"Language", header->language},
+                                {"Description", header->description},
+                                {"RegistryPrefix", header->registryPrefix},
+                                {"RegistryVersion", header->registryVersion},
+                                {"OwningEntity", header->owningEntity}};
+
+    nlohmann::json& messageObj = asyncResp->res.jsonValue["Messages"];
+
+    // Go through the Message Registry and populate each Message
+    for (const message_registries::MessageEntry* message : registryEntries)
+    {
+        nlohmann::json& obj = messageObj[message->first];
+        obj = {{"Description", message->second.description},
+               {"Message", message->second.message},
+               {"Severity", message->second.severity},
+               {"MessageSeverity", message->second.messageSeverity},
+               {"NumberOfArgs", message->second.numberOfArgs},
+               {"Resolution", message->second.resolution}};
+        if (message->second.numberOfArgs > 0)
+        {
+            nlohmann::json& messageParamArray = obj["ParamTypes"];
+            messageParamArray = nlohmann::json::array();
+            for (const char* str : message->second.paramTypes)
+            {
+                if (str == nullptr)
                 {
-                    asyncResp->res.jsonValue["Location"][0]["PublicationUri"] =
-                        url;
+                    break;
                 }
-            });
+                messageParamArray.push_back(str);
+            }
+        }
+    }
 }
 
 inline void requestRoutesMessageRegistry(App& app)
 {
     BMCWEB_ROUTE(app, "/redfish/v1/Registries/<str>/<str>/")
         .privileges(redfish::privileges::getMessageRegistryFile)
-        .methods(boost::beast::http::verb::get)(
-            [](const crow::Request&,
-               const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
-               const std::string& registry, const std::string& registry1)
-
-            {
-                const message_registries::Header* header;
-                std::vector<const message_registries::MessageEntry*>
-                    registryEntries;
-                if (registry == "Base")
-                {
-                    header = &message_registries::base::header;
-                    for (const message_registries::MessageEntry& entry :
-                         message_registries::base::registry)
-                    {
-                        registryEntries.emplace_back(&entry);
-                    }
-                }
-                else if (registry == "TaskEvent")
-                {
-                    header = &message_registries::task_event::header;
-                    for (const message_registries::MessageEntry& entry :
-                         message_registries::task_event::registry)
-                    {
-                        registryEntries.emplace_back(&entry);
-                    }
-                }
-                else if (registry == "OpenBMC")
-                {
-                    header = &message_registries::openbmc::header;
-                    for (const message_registries::MessageEntry& entry :
-                         message_registries::openbmc::registry)
-                    {
-                        registryEntries.emplace_back(&entry);
-                    }
-                }
-                else if (registry == "ResourceEvent")
-                {
-                    header = &message_registries::resource_event::header;
-                    for (const message_registries::MessageEntry& entry :
-                         message_registries::resource_event::registry)
-                    {
-                        registryEntries.emplace_back(&entry);
-                    }
-                }
-                else
-                {
-                    messages::resourceNotFound(
-                        asyncResp->res,
-                        "#MessageRegistryFile.v1_1_0.MessageRegistryFile",
-                        registry);
-                    return;
-                }
-
-                if (registry != registry1)
-                {
-                    messages::resourceNotFound(asyncResp->res, header->type,
-                                               registry1);
-                    return;
-                }
-
-                asyncResp->res.jsonValue = {
-                    {"@Redfish.Copyright", header->copyright},
-                    {"@odata.type", header->type},
-                    {"Id", header->id},
-                    {"Name", header->name},
-                    {"Language", header->language},
-                    {"Description", header->description},
-                    {"RegistryPrefix", header->registryPrefix},
-                    {"RegistryVersion", header->registryVersion},
-                    {"OwningEntity", header->owningEntity}};
-
-                nlohmann::json& messageObj =
-                    asyncResp->res.jsonValue["Messages"];
-
-                // Go through the Message Registry and populate each Message
-                for (const message_registries::MessageEntry* message :
-                     registryEntries)
-                {
-                    nlohmann::json& obj = messageObj[message->first];
-                    obj = {{"Description", message->second.description},
-                           {"Message", message->second.message},
-                           {"Severity", message->second.severity},
-                           {"MessageSeverity", message->second.messageSeverity},
-                           {"NumberOfArgs", message->second.numberOfArgs},
-                           {"Resolution", message->second.resolution}};
-                    if (message->second.numberOfArgs > 0)
-                    {
-                        nlohmann::json& messageParamArray = obj["ParamTypes"];
-                        messageParamArray = nlohmann::json::array();
-                        for (const char* str : message->second.paramTypes)
-                        {
-                            if (str == nullptr)
-                            {
-                                break;
-                            }
-                            messageParamArray.push_back(str);
-                        }
-                    }
-                }
-            });
+        .methods(boost::beast::http::verb::get)(handleMessageRegistryGet);
 }
-
 } // namespace redfish
