diff --git a/redfish-core/include/error_messages.hpp b/redfish-core/include/error_messages.hpp
index 0295d49..4d71745 100644
--- a/redfish-core/include/error_messages.hpp
+++ b/redfish-core/include/error_messages.hpp
@@ -42,6 +42,8 @@
  *
  *
  * @returns Message ResourceInUse formatted to JSON */
+nlohmann::json resourceInUse(void);
+
 void resourceInUse(crow::Response& res);
 
 /**
@@ -51,6 +53,8 @@
  *
  *
  * @returns Message MalformedJSON formatted to JSON */
+nlohmann::json malformedJSON(void);
+
 void malformedJSON(crow::Response& res);
 
 /**
@@ -60,6 +64,8 @@
  * @param[in] arg1 Parameter of message that will replace %1 in its body.
  *
  * @returns Message ResourceMissingAtURI formatted to JSON */
+nlohmann::json resourceMissingAtURI(const std::string& arg1);
+
 void resourceMissingAtURI(crow::Response& res, const std::string& arg1);
 
 /**
@@ -72,6 +78,10 @@
  * @param[in] arg3 Parameter of message that will replace %3 in its body.
  *
  * @returns Message ActionParameterValueFormatError formatted to JSON */
+nlohmann::json actionParameterValueFormatError(const std::string& arg1,
+                                               const std::string& arg2,
+                                               const std::string& arg3);
+
 void actionParameterValueFormatError(crow::Response& res,
                                      const std::string& arg1,
                                      const std::string& arg2,
@@ -84,6 +94,8 @@
  *
  *
  * @returns Message InternalError formatted to JSON */
+nlohmann::json internalError(void);
+
 void internalError(crow::Response& res);
 
 /**
@@ -93,6 +105,8 @@
  *
  *
  * @returns Message UnrecognizedRequestBody formatted to JSON */
+nlohmann::json unrecognizedRequestBody(void);
+
 void unrecognizedRequestBody(crow::Response& res);
 
 /**
@@ -104,6 +118,9 @@
  * @param[in] arg2 Parameter of message that will replace %2 in its body.
  *
  * @returns Message ResourceAtUriUnauthorized formatted to JSON */
+nlohmann::json resourceAtUriUnauthorized(const std::string& arg1,
+                                         const std::string& arg2);
+
 void resourceAtUriUnauthorized(crow::Response& res, const std::string& arg1,
                                const std::string& arg2);
 
@@ -116,6 +133,9 @@
  * @param[in] arg2 Parameter of message that will replace %2 in its body.
  *
  * @returns Message ActionParameterUnknown formatted to JSON */
+nlohmann::json actionParameterUnknown(const std::string& arg1,
+                                      const std::string& arg2);
+
 void actionParameterUnknown(crow::Response& res, const std::string& arg1,
                             const std::string& arg2);
 
@@ -126,6 +146,8 @@
  *
  *
  * @returns Message ResourceCannotBeDeleted formatted to JSON */
+nlohmann::json resourceCannotBeDeleted(void);
+
 void resourceCannotBeDeleted(crow::Response& res);
 
 /**
@@ -135,6 +157,8 @@
  * @param[in] arg1 Parameter of message that will replace %1 in its body.
  *
  * @returns Message PropertyDuplicate formatted to JSON */
+nlohmann::json propertyDuplicate(const std::string& arg1);
+
 void propertyDuplicate(crow::Response& res, const std::string& arg1);
 
 /**
@@ -145,6 +169,8 @@
  * @param[in] arg1 Parameter of message that will replace %1 in its body.
  *
  * @returns Message ServiceTemporarilyUnavailable formatted to JSON */
+nlohmann::json serviceTemporarilyUnavailable(const std::string& arg1);
+
 void serviceTemporarilyUnavailable(crow::Response& res,
                                    const std::string& arg1);
 
@@ -158,6 +184,10 @@
  * @param[in] arg3 Parameter of message that will replace %3 in its body.
  *
  * @returns Message ResourceAlreadyExists formatted to JSON */
+nlohmann::json resourceAlreadyExists(const std::string& arg1,
+                                     const std::string& arg2,
+                                     const std::string& arg3);
+
 void resourceAlreadyExists(crow::Response& res, const std::string& arg1,
                            const std::string& arg2, const std::string& arg3);
 
@@ -168,6 +198,8 @@
  *
  *
  * @returns Message AccountForSessionNoLongerExists formatted to JSON */
+nlohmann::json accountForSessionNoLongerExists(void);
+
 void accountForSessionNoLongerExists(crow::Response& res);
 
 /**
@@ -178,6 +210,8 @@
  * @param[in] arg1 Parameter of message that will replace %1 in its body.
  *
  * @returns Message CreateFailedMissingReqProperties formatted to JSON */
+nlohmann::json createFailedMissingReqProperties(const std::string& arg1);
+
 void createFailedMissingReqProperties(crow::Response& res,
                                       const std::string& arg1);
 
@@ -190,6 +224,9 @@
  * @param[in] arg2 Parameter of message that will replace %2 in its body.
  *
  * @returns Message PropertyValueFormatError formatted to JSON */
+nlohmann::json propertyValueFormatError(const std::string& arg1,
+                                        const std::string& arg2);
+
 void propertyValueFormatError(crow::Response& res, const std::string& arg1,
                               const std::string& arg2);
 
@@ -202,6 +239,9 @@
  * @param[in] arg2 Parameter of message that will replace %2 in its body.
  *
  * @returns Message PropertyValueNotInList formatted to JSON */
+nlohmann::json propertyValueNotInList(const std::string& arg1,
+                                      const std::string& arg2);
+
 void propertyValueNotInList(crow::Response& res, const std::string& arg1,
                             const std::string& arg2);
 
@@ -213,6 +253,8 @@
  * @param[in] arg1 Parameter of message that will replace %1 in its body.
  *
  * @returns Message ResourceAtUriInUnknownFormat formatted to JSON */
+nlohmann::json resourceAtUriInUnknownFormat(const std::string& arg1);
+
 void resourceAtUriInUnknownFormat(crow::Response& res, const std::string& arg1);
 
 /**
@@ -222,6 +264,8 @@
  *
  *
  * @returns Message ServiceInUnknownState formatted to JSON */
+nlohmann::json serviceInUnknownState(void);
+
 void serviceInUnknownState(crow::Response& res);
 
 /**
@@ -231,6 +275,8 @@
  *
  *
  * @returns Message EventSubscriptionLimitExceeded formatted to JSON */
+nlohmann::json eventSubscriptionLimitExceeded(void);
+
 void eventSubscriptionLimitExceeded(crow::Response& res);
 
 /**
@@ -242,6 +288,9 @@
  * @param[in] arg2 Parameter of message that will replace %2 in its body.
  *
  * @returns Message ActionParameterMissing formatted to JSON */
+nlohmann::json actionParameterMissing(const std::string& arg1,
+                                      const std::string& arg2);
+
 void actionParameterMissing(crow::Response& res, const std::string& arg1,
                             const std::string& arg2);
 
@@ -253,6 +302,8 @@
  * @param[in] arg2 Parameter of message that will replace %2 in its body.
  *
  * @returns Message StringValueTooLong formatted to JSON */
+nlohmann::json stringValueTooLong(const std::string& arg1, const int& arg2);
+
 void stringValueTooLong(crow::Response& res, const std::string& arg1,
                         const int& arg2);
 
@@ -262,6 +313,8 @@
  *
  *
  * @returns Message SessionTerminated formatted to JSON */
+nlohmann::json sessionTerminated(void);
+
 void sessionTerminated(crow::Response& res);
 
 /**
@@ -273,6 +326,9 @@
  * @param[in] arg2 Parameter of message that will replace %2 in its body.
  *
  * @returns Message ResourceTypeIncompatible formatted to JSON */
+nlohmann::json resourceTypeIncompatible(const std::string& arg1,
+                                        const std::string& arg2);
+
 void resourceTypeIncompatible(crow::Response& res, const std::string& arg1,
                               const std::string& arg2);
 
@@ -285,6 +341,9 @@
  * @param[in] arg2 Parameter of message that will replace %2 in its body.
  *
  * @returns Message PropertyValueTypeError formatted to JSON */
+nlohmann::json propertyValueTypeError(const std::string& arg1,
+                                      const std::string& arg2);
+
 void propertyValueTypeError(crow::Response& res, const std::string& arg1,
                             const std::string& arg2);
 
@@ -297,6 +356,9 @@
  * @param[in] arg2 Parameter of message that will replace %2 in its body.
  *
  * @returns Message ResourceNotFound formatted to JSON */
+nlohmann::json resourceNotFound(const std::string& arg1,
+                                const std::string& arg2);
+
 void resourceNotFound(crow::Response& res, const std::string& arg1,
                       const std::string& arg2);
 
@@ -308,6 +370,8 @@
  * @param[in] arg1 Parameter of message that will replace %1 in its body.
  *
  * @returns Message CouldNotEstablishConnection formatted to JSON */
+nlohmann::json couldNotEstablishConnection(const std::string& arg1);
+
 void couldNotEstablishConnection(crow::Response& res, const std::string& arg1);
 
 /**
@@ -318,6 +382,8 @@
  * @param[in] arg1 Parameter of message that will replace %1 in its body.
  *
  * @returns Message PropertyNotWritable formatted to JSON */
+nlohmann::json propertyNotWritable(const std::string& arg1);
+
 void propertyNotWritable(crow::Response& res, const std::string& arg1);
 
 /**
@@ -329,6 +395,9 @@
  * @param[in] arg2 Parameter of message that will replace %2 in its body.
  *
  * @returns Message QueryParameterValueTypeError formatted to JSON */
+nlohmann::json queryParameterValueTypeError(const std::string& arg1,
+                                            const std::string& arg2);
+
 void queryParameterValueTypeError(crow::Response& res, const std::string& arg1,
                                   const std::string& arg2);
 
@@ -339,6 +408,8 @@
  *
  *
  * @returns Message ServiceShuttingDown formatted to JSON */
+nlohmann::json serviceShuttingDown(void);
+
 void serviceShuttingDown(crow::Response& res);
 
 /**
@@ -350,6 +421,9 @@
  * @param[in] arg2 Parameter of message that will replace %2 in its body.
  *
  * @returns Message ActionParameterDuplicate formatted to JSON */
+nlohmann::json actionParameterDuplicate(const std::string& arg1,
+                                        const std::string& arg2);
+
 void actionParameterDuplicate(crow::Response& res, const std::string& arg1,
                               const std::string& arg2);
 
@@ -362,6 +436,9 @@
  * @param[in] arg2 Parameter of message that will replace %2 in its body.
  *
  * @returns Message ActionParameterNotSupported formatted to JSON */
+nlohmann::json actionParameterNotSupported(const std::string& arg1,
+                                           const std::string& arg2);
+
 void actionParameterNotSupported(crow::Response& res, const std::string& arg1,
                                  const std::string& arg2);
 
@@ -374,6 +451,9 @@
  * @param[in] arg2 Parameter of message that will replace %2 in its body.
  *
  * @returns Message SourceDoesNotSupportProtocol formatted to JSON */
+nlohmann::json sourceDoesNotSupportProtocol(const std::string& arg1,
+                                            const std::string& arg2);
+
 void sourceDoesNotSupportProtocol(crow::Response& res, const std::string& arg1,
                                   const std::string& arg2);
 
@@ -383,6 +463,8 @@
  *
  *
  * @returns Message AccountRemoved formatted to JSON */
+nlohmann::json accountRemoved(void);
+
 void accountRemoved(crow::Response& res);
 
 /**
@@ -393,6 +475,8 @@
  * @param[in] arg1 Parameter of message that will replace %1 in its body.
  *
  * @returns Message AccessDenied formatted to JSON */
+nlohmann::json accessDenied(const std::string& arg1);
+
 void accessDenied(crow::Response& res, const std::string& arg1);
 
 /**
@@ -401,6 +485,8 @@
  *
  *
  * @returns Message QueryNotSupported formatted to JSON */
+nlohmann::json queryNotSupported(void);
+
 void queryNotSupported(crow::Response& res);
 
 /**
@@ -410,6 +496,8 @@
  *
  *
  * @returns Message CreateLimitReachedForResource formatted to JSON */
+nlohmann::json createLimitReachedForResource(void);
+
 void createLimitReachedForResource(crow::Response& res);
 
 /**
@@ -419,6 +507,8 @@
  *
  *
  * @returns Message GeneralError formatted to JSON */
+nlohmann::json generalError(void);
+
 void generalError(crow::Response& res);
 
 /**
@@ -427,6 +517,8 @@
  *
  *
  * @returns Message Success formatted to JSON */
+nlohmann::json success(void);
+
 void success(crow::Response& res);
 
 /**
@@ -435,6 +527,8 @@
  *
  *
  * @returns Message Created formatted to JSON */
+nlohmann::json created(void);
+
 void created(crow::Response& res);
 
 /**
@@ -444,6 +538,8 @@
  *
  *
  * @returns Message NoOperation formatted to JSON */
+nlohmann::json noOperation(void);
+
 void noOperation(crow::Response& res);
 
 /**
@@ -454,6 +550,8 @@
  * @param[in] arg1 Parameter of message that will replace %1 in its body.
  *
  * @returns Message PropertyUnknown formatted to JSON */
+nlohmann::json propertyUnknown(const std::string& arg1);
+
 void propertyUnknown(crow::Response& res, const std::string& arg1);
 
 /**
@@ -463,6 +561,8 @@
  *
  *
  * @returns Message NoValidSession formatted to JSON */
+nlohmann::json noValidSession(void);
+
 void noValidSession(crow::Response& res);
 
 /**
@@ -472,6 +572,8 @@
  * @param[in] arg1 Parameter of message that will replace %1 in its body.
  *
  * @returns Message InvalidObject formatted to JSON */
+nlohmann::json invalidObject(const std::string& arg1);
+
 void invalidObject(crow::Response& res, const std::string& arg1);
 
 /**
@@ -481,6 +583,8 @@
  *
  *
  * @returns Message ResourceInStandby formatted to JSON */
+nlohmann::json resourceInStandby(void);
+
 void resourceInStandby(crow::Response& res);
 
 /**
@@ -493,6 +597,10 @@
  * @param[in] arg3 Parameter of message that will replace %3 in its body.
  *
  * @returns Message ActionParameterValueTypeError formatted to JSON */
+nlohmann::json actionParameterValueTypeError(const std::string& arg1,
+                                             const std::string& arg2,
+                                             const std::string& arg3);
+
 void actionParameterValueTypeError(crow::Response& res, const std::string& arg1,
                                    const std::string& arg2,
                                    const std::string& arg3);
@@ -504,6 +612,8 @@
  *
  *
  * @returns Message SessionLimitExceeded formatted to JSON */
+nlohmann::json sessionLimitExceeded(void);
+
 void sessionLimitExceeded(crow::Response& res);
 
 /**
@@ -513,6 +623,8 @@
  * @param[in] arg1 Parameter of message that will replace %1 in its body.
  *
  * @returns Message ActionNotSupported formatted to JSON */
+nlohmann::json actionNotSupported(const std::string& arg1);
+
 void actionNotSupported(crow::Response& res, const std::string& arg1);
 
 /**
@@ -522,6 +634,8 @@
  * @param[in] arg1 Parameter of message that will replace %1 in its body.
  *
  * @returns Message InvalidIndex formatted to JSON */
+nlohmann::json invalidIndex(const int& arg1);
+
 void invalidIndex(crow::Response& res, const int& arg1);
 
 /**
@@ -531,6 +645,8 @@
  *
  *
  * @returns Message EmptyJSON formatted to JSON */
+nlohmann::json emptyJSON(void);
+
 void emptyJSON(crow::Response& res);
 
 /**
@@ -539,6 +655,8 @@
  *
  *
  * @returns Message QueryNotSupportedOnResource formatted to JSON */
+nlohmann::json queryNotSupportedOnResource(void);
+
 void queryNotSupportedOnResource(crow::Response& res);
 
 /**
@@ -549,6 +667,8 @@
  *
  *
  * @returns Message InsufficientPrivilege formatted to JSON */
+nlohmann::json insufficientPrivilege(void);
+
 void insufficientPrivilege(crow::Response& res);
 
 /**
@@ -560,6 +680,9 @@
  * @param[in] arg2 Parameter of message that will replace %2 in its body.
  *
  * @returns Message PropertyValueModified formatted to JSON */
+nlohmann::json propertyValueModified(const std::string& arg1,
+                                     const std::string& arg2);
+
 void propertyValueModified(crow::Response& res, const std::string& arg1,
                            const std::string& arg2);
 
@@ -569,6 +692,8 @@
  *
  *
  * @returns Message AccountNotModified formatted to JSON */
+nlohmann::json accountNotModified(void);
+
 void accountNotModified(crow::Response& res);
 
 /**
@@ -580,6 +705,10 @@
  * @param[in] arg2 Parameter of message that will replace %2 in its body.
  *
  * @returns Message QueryParameterValueFormatError formatted to JSON */
+
+nlohmann::json queryParameterValueFormatError(const std::string& arg1,
+                                              const std::string& arg2);
+
 void queryParameterValueFormatError(crow::Response& res,
                                     const std::string& arg1,
                                     const std::string& arg2);
@@ -592,6 +721,8 @@
  * @param[in] arg1 Parameter of message that will replace %1 in its body.
  *
  * @returns Message PropertyMissing formatted to JSON */
+nlohmann::json propertyMissing(const std::string& arg1);
+
 void propertyMissing(crow::Response& res, const std::string& arg1);
 
 /**
@@ -602,6 +733,8 @@
  * @param[in] arg1 Parameter of message that will replace %1 in its body.
  *
  * @returns Message ResourceExhaustion formatted to JSON */
+nlohmann::json resourceExhaustion(const std::string& arg1);
+
 void resourceExhaustion(crow::Response& res, const std::string& arg1);
 
 /**
@@ -610,6 +743,8 @@
  *
  *
  * @returns Message AccountModified formatted to JSON */
+nlohmann::json accountModified(void);
+
 void accountModified(crow::Response& res);
 
 /**
@@ -622,6 +757,10 @@
  * @param[in] arg3 Parameter of message that will replace %3 in its body.
  *
  * @returns Message QueryParameterOutOfRange formatted to JSON */
+nlohmann::json queryParameterOutOfRange(const std::string& arg1,
+                                        const std::string& arg2,
+                                        const std::string& arg3);
+
 void queryParameterOutOfRange(crow::Response& res, const std::string& arg1,
                               const std::string& arg2, const std::string& arg3);
 
diff --git a/redfish-core/src/error_messages.cpp b/redfish-core/src/error_messages.cpp
index 0eda7b4..f76d4c7 100644
--- a/redfish-core/src/error_messages.cpp
+++ b/redfish-core/src/error_messages.cpp
@@ -105,20 +105,23 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json resourceInUse(void)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.ResourceInUse"},
+        {"Message", "The change to the requested resource failed because "
+                    "the resource is in use or in transition."},
+        {"MessageArgs", nlohmann::json::array()},
+        {"Severity", "Warning"},
+        {"Resolution", "Remove the condition and resubmit the request if "
+                       "the operation failed."}};
+}
+
 void resourceInUse(crow::Response& res)
 {
     res.result(boost::beast::http::status::service_unavailable);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.ResourceInUse"},
-            {"Message", "The change to the requested resource failed because "
-                        "the resource is in use or in transition."},
-            {"MessageArgs", nlohmann::json::array()},
-            {"Severity", "Warning"},
-            {"Resolution", "Remove the condition and resubmit the request if "
-                           "the operation failed."}});
+    addMessageToErrorJson(res.jsonValue, resourceInUse());
 }
 
 /**
@@ -128,20 +131,23 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json malformedJSON(void)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.MalformedJSON"},
+        {"Message", "The request body submitted was malformed JSON and "
+                    "could not be parsed by the receiving service."},
+        {"MessageArgs", nlohmann::json::array()},
+        {"Severity", "Critical"},
+        {"Resolution", "Ensure that the request body is valid JSON and "
+                       "resubmit the request."}};
+}
+
 void malformedJSON(crow::Response& res)
 {
     res.result(boost::beast::http::status::bad_request);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.MalformedJSON"},
-            {"Message", "The request body submitted was malformed JSON and "
-                        "could not be parsed by the receiving service."},
-            {"MessageArgs", nlohmann::json::array()},
-            {"Severity", "Critical"},
-            {"Resolution", "Ensure that the request body is valid JSON and "
-                           "resubmit the request."}});
+    addMessageToErrorJson(res.jsonValue, malformedJSON());
 }
 
 /**
@@ -151,19 +157,22 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json resourceMissingAtURI(const std::string& arg1)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.ResourceMissingAtURI"},
+        {"Message", "The resource at the URI " + arg1 + " was not found."},
+        {"MessageArgs", {arg1}},
+        {"Severity", "Critical"},
+        {"Resolution", "Place a valid resource at the URI or correct the "
+                       "URI and resubmit the request."}};
+}
+
 void resourceMissingAtURI(crow::Response& res, const std::string& arg1)
 {
     res.result(boost::beast::http::status::bad_request);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.ResourceMissingAtURI"},
-            {"Message", "The resource at the URI " + arg1 + " was not found."},
-            {"MessageArgs", {arg1}},
-            {"Severity", "Critical"},
-            {"Resolution", "Place a valid resource at the URI or correct the "
-                           "URI and resubmit the request."}});
+    addMessageToErrorJson(res.jsonValue, resourceMissingAtURI(arg1));
 }
 
 /**
@@ -173,26 +182,32 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json actionParameterValueFormatError(const std::string& arg1,
+                                               const std::string& arg2,
+                                               const std::string& arg3)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.ActionParameterValueFormatError"},
+        {"Message",
+         "The value " + arg1 + " for the parameter " + arg2 +
+             " in the action " + arg3 +
+             " is of a different format than the parameter can accept."},
+        {"MessageArgs", {arg1, arg2, arg3}},
+        {"Severity", "Warning"},
+        {"Resolution",
+         "Correct the value for the parameter in the request body and "
+         "resubmit the request if the operation failed."}};
+}
+
 void actionParameterValueFormatError(crow::Response& res,
                                      const std::string& arg1,
                                      const std::string& arg2,
                                      const std::string& arg3)
 {
     res.result(boost::beast::http::status::bad_request);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.ActionParameterValueFormatError"},
-            {"Message",
-             "The value " + arg1 + " for the parameter " + arg2 +
-                 " in the action " + arg3 +
-                 " is of a different format than the parameter can accept."},
-            {"MessageArgs", {arg1, arg2, arg3}},
-            {"Severity", "Warning"},
-            {"Resolution",
-             "Correct the value for the parameter in the request body and "
-             "resubmit the request if the operation failed."}});
+    addMessageToErrorJson(res.jsonValue,
+                          actionParameterValueFormatError(arg1, arg2, arg3));
 }
 
 /**
@@ -202,20 +217,23 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json internalError(void)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.InternalError"},
+        {"Message", "The request failed due to an internal service error.  "
+                    "The service is still operational."},
+        {"MessageArgs", nlohmann::json::array()},
+        {"Severity", "Critical"},
+        {"Resolution", "Resubmit the request.  If the problem persists, "
+                       "consider resetting the service."}};
+}
+
 void internalError(crow::Response& res)
 {
     res.result(boost::beast::http::status::internal_server_error);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.InternalError"},
-            {"Message", "The request failed due to an internal service error.  "
-                        "The service is still operational."},
-            {"MessageArgs", nlohmann::json::array()},
-            {"Severity", "Critical"},
-            {"Resolution", "Resubmit the request.  If the problem persists, "
-                           "consider resetting the service."}});
+    addMessageToErrorJson(res.jsonValue, internalError());
 }
 
 /**
@@ -225,20 +243,23 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json unrecognizedRequestBody(void)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.UnrecognizedRequestBody"},
+        {"Message", "The service detected a malformed request body that it "
+                    "was unable to interpret."},
+        {"MessageArgs", nlohmann::json::array()},
+        {"Severity", "Warning"},
+        {"Resolution", "Correct the request body and resubmit the request "
+                       "if it failed."}};
+}
+
 void unrecognizedRequestBody(crow::Response& res)
 {
     res.result(boost::beast::http::status::bad_request);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.UnrecognizedRequestBody"},
-            {"Message", "The service detected a malformed request body that it "
-                        "was unable to interpret."},
-            {"MessageArgs", nlohmann::json::array()},
-            {"Severity", "Warning"},
-            {"Resolution", "Correct the request body and resubmit the request "
-                           "if it failed."}});
+    addMessageToErrorJson(res.jsonValue, unrecognizedRequestBody());
 }
 
 /**
@@ -248,22 +269,26 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json resourceAtUriUnauthorized(const std::string& arg1,
+                                         const std::string& arg2)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.ResourceAtUriUnauthorized"},
+        {"Message", "While accessing the resource at " + arg1 +
+                        ", the service received an authorization error " +
+                        arg2 + "."},
+        {"MessageArgs", {arg1, arg2}},
+        {"Severity", "Critical"},
+        {"Resolution", "Ensure that the appropriate access is provided for "
+                       "the service in order for it to access the URI."}};
+}
+
 void resourceAtUriUnauthorized(crow::Response& res, const std::string& arg1,
                                const std::string& arg2)
 {
     res.result(boost::beast::http::status::unauthorized);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.ResourceAtUriUnauthorized"},
-            {"Message", "While accessing the resource at " + arg1 +
-                            ", the service received an authorization error " +
-                            arg2 + "."},
-            {"MessageArgs", {arg1, arg2}},
-            {"Severity", "Critical"},
-            {"Resolution", "Ensure that the appropriate access is provided for "
-                           "the service in order for it to access the URI."}});
+    addMessageToErrorJson(res.jsonValue, resourceAtUriUnauthorized(arg1, arg2));
 }
 
 /**
@@ -273,22 +298,26 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json actionParameterUnknown(const std::string& arg1,
+                                      const std::string& arg2)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.ActionParameterUnknown"},
+        {"Message", "The action " + arg1 +
+                        " was submitted with the invalid parameter " + arg2 +
+                        "."},
+        {"MessageArgs", {arg1, arg2}},
+        {"Severity", "Warning"},
+        {"Resolution", "Correct the invalid parameter and resubmit the "
+                       "request if the operation failed."}};
+}
+
 void actionParameterUnknown(crow::Response& res, const std::string& arg1,
                             const std::string& arg2)
 {
     res.result(boost::beast::http::status::bad_request);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.ActionParameterUnknown"},
-            {"Message", "The action " + arg1 +
-                            " was submitted with the invalid parameter " +
-                            arg2 + "."},
-            {"MessageArgs", {arg1, arg2}},
-            {"Severity", "Warning"},
-            {"Resolution", "Correct the invalid parameter and resubmit the "
-                           "request if the operation failed."}});
+    addMessageToErrorJson(res.jsonValue, actionParameterUnknown(arg1, arg2));
 }
 
 /**
@@ -298,20 +327,22 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json resourceCannotBeDeleted(void)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.ResourceCannotBeDeleted"},
+        {"Message", "The delete request failed because the resource "
+                    "requested cannot be deleted."},
+        {"MessageArgs", nlohmann::json::array()},
+        {"Severity", "Critical"},
+        {"Resolution", "Do not attempt to delete a non-deletable resource."}};
+}
+
 void resourceCannotBeDeleted(crow::Response& res)
 {
     res.result(boost::beast::http::status::forbidden);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.ResourceCannotBeDeleted"},
-            {"Message", "The delete request failed because the resource "
-                        "requested cannot be deleted."},
-            {"MessageArgs", nlohmann::json::array()},
-            {"Severity", "Critical"},
-            {"Resolution",
-             "Do not attempt to delete a non-deletable resource."}});
+    addMessageToErrorJson(res.jsonValue, resourceCannotBeDeleted());
 }
 
 /**
@@ -321,22 +352,23 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json propertyDuplicate(const std::string& arg1)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.PropertyDuplicate"},
+        {"Message", "The property " + arg1 + " was duplicated in the request."},
+        {"MessageArgs", {arg1}},
+        {"Severity", "Warning"},
+        {"Resolution",
+         "Remove the duplicate property from the request body and resubmit "
+         "the request if the operation failed."}};
+}
+
 void propertyDuplicate(crow::Response& res, const std::string& arg1)
 {
     res.result(boost::beast::http::status::bad_request);
-    addMessageToJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.PropertyDuplicate"},
-            {"Message",
-             "The property " + arg1 + " was duplicated in the request."},
-            {"MessageArgs", {arg1}},
-            {"Severity", "Warning"},
-            {"Resolution",
-             "Remove the duplicate property from the request body and resubmit "
-             "the request if the operation failed."}},
-        arg1);
+    addMessageToJson(res.jsonValue, propertyDuplicate(arg1), arg1);
 }
 
 /**
@@ -346,21 +378,24 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json serviceTemporarilyUnavailable(const std::string& arg1)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.ServiceTemporarilyUnavailable"},
+        {"Message", "The service is temporarily unavailable.  Retry in " +
+                        arg1 + " seconds."},
+        {"MessageArgs", {arg1}},
+        {"Severity", "Critical"},
+        {"Resolution", "Wait for the indicated retry duration and retry "
+                       "the operation."}};
+}
+
 void serviceTemporarilyUnavailable(crow::Response& res, const std::string& arg1)
 {
     res.addHeader("Retry-After", arg1);
     res.result(boost::beast::http::status::service_unavailable);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.ServiceTemporarilyUnavailable"},
-            {"Message", "The service is temporarily unavailable.  Retry in " +
-                            arg1 + " seconds."},
-            {"MessageArgs", {arg1}},
-            {"Severity", "Critical"},
-            {"Resolution", "Wait for the indicated retry duration and retry "
-                           "the operation."}});
+    addMessageToErrorJson(res.jsonValue, serviceTemporarilyUnavailable(arg1));
 }
 
 /**
@@ -370,23 +405,28 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json resourceAlreadyExists(const std::string& arg1,
+                                     const std::string& arg2,
+                                     const std::string& arg3)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.ResourceAlreadyExists"},
+        {"Message", "The requested resource of type " + arg1 +
+                        " with the property " + arg2 + " with the value " +
+                        arg3 + " already exists."},
+        {"MessageArgs", {arg1, arg2, arg3}},
+        {"Severity", "Critical"},
+        {"Resolution", "Do not repeat the create operation as the resource "
+                       "has already been created."}};
+}
+
 void resourceAlreadyExists(crow::Response& res, const std::string& arg1,
                            const std::string& arg2, const std::string& arg3)
 {
     res.result(boost::beast::http::status::bad_request);
-    addMessageToJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.ResourceAlreadyExists"},
-            {"Message", "The requested resource of type " + arg1 +
-                            " with the property " + arg2 + " with the value " +
-                            arg3 + " already exists."},
-            {"MessageArgs", {arg1, arg2, arg3}},
-            {"Severity", "Critical"},
-            {"Resolution", "Do not repeat the create operation as the resource "
-                           "has already been created."}},
-        arg2);
+    addMessageToJson(res.jsonValue, resourceAlreadyExists(arg1, arg2, arg3),
+                     arg2);
 }
 
 /**
@@ -396,19 +436,22 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json accountForSessionNoLongerExists(void)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.AccountForSessionNoLongerExists"},
+        {"Message", "The account for the current session has been removed, "
+                    "thus the current session has been removed as well."},
+        {"MessageArgs", nlohmann::json::array()},
+        {"Severity", "OK"},
+        {"Resolution", "Attempt to connect with a valid account."}};
+}
+
 void accountForSessionNoLongerExists(crow::Response& res)
 {
     res.result(boost::beast::http::status::forbidden);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.AccountForSessionNoLongerExists"},
-            {"Message", "The account for the current session has been removed, "
-                        "thus the current session has been removed as well."},
-            {"MessageArgs", nlohmann::json::array()},
-            {"Severity", "OK"},
-            {"Resolution", "Attempt to connect with a valid account."}});
+    addMessageToErrorJson(res.jsonValue, accountForSessionNoLongerExists());
 }
 
 /**
@@ -418,24 +461,27 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json createFailedMissingReqProperties(const std::string& arg1)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.CreateFailedMissingReqProperties"},
+        {"Message",
+         "The create operation failed because the required property " + arg1 +
+             " was missing from the request."},
+        {"MessageArgs", {arg1}},
+        {"Severity", "Critical"},
+        {"Resolution",
+         "Correct the body to include the required property with a valid "
+         "value and resubmit the request if the operation failed."}};
+}
+
 void createFailedMissingReqProperties(crow::Response& res,
                                       const std::string& arg1)
 {
     res.result(boost::beast::http::status::bad_request);
-    addMessageToJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.CreateFailedMissingReqProperties"},
-            {"Message",
-             "The create operation failed because the required property " +
-                 arg1 + " was missing from the request."},
-            {"MessageArgs", {arg1}},
-            {"Severity", "Critical"},
-            {"Resolution",
-             "Correct the body to include the required property with a valid "
-             "value and resubmit the request if the operation failed."}},
-        arg1);
+    addMessageToJson(res.jsonValue, createFailedMissingReqProperties(arg1),
+                     arg1);
 }
 
 /**
@@ -446,24 +492,27 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json propertyValueFormatError(const std::string& arg1,
+                                        const std::string& arg2)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.PropertyValueFormatError"},
+        {"Message",
+         "The value " + arg1 + " for the property " + arg2 +
+             " is of a different format than the property can accept."},
+        {"MessageArgs", {arg1, arg2}},
+        {"Severity", "Warning"},
+        {"Resolution",
+         "Correct the value for the property in the request body and "
+         "resubmit the request if the operation failed."}};
+}
+
 void propertyValueFormatError(crow::Response& res, const std::string& arg1,
                               const std::string& arg2)
 {
     res.result(boost::beast::http::status::bad_request);
-    addMessageToJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.PropertyValueFormatError"},
-            {"Message",
-             "The value " + arg1 + " for the property " + arg2 +
-                 " is of a different format than the property can accept."},
-            {"MessageArgs", {arg1, arg2}},
-            {"Severity", "Warning"},
-            {"Resolution",
-             "Correct the value for the property in the request body and "
-             "resubmit the request if the operation failed."}},
-        arg2);
+    addMessageToJson(res.jsonValue, propertyValueFormatError(arg1, arg2), arg2);
 }
 
 /**
@@ -474,23 +523,27 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json propertyValueNotInList(const std::string& arg1,
+                                      const std::string& arg2)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.PropertyValueNotInList"},
+        {"Message", "The value " + arg1 + " for the property " + arg2 +
+                        " is not in the list of acceptable values."},
+        {"MessageArgs", {arg1, arg2}},
+        {"Severity", "Warning"},
+        {"Resolution", "Choose a value from the enumeration list that "
+                       "the implementation "
+                       "can support and resubmit the request if the "
+                       "operation failed."}};
+}
+
 void propertyValueNotInList(crow::Response& res, const std::string& arg1,
                             const std::string& arg2)
 {
     res.result(boost::beast::http::status::bad_request);
-    addMessageToJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.PropertyValueNotInList"},
-            {"Message", "The value " + arg1 + " for the property " + arg2 +
-                            " is not in the list of acceptable values."},
-            {"MessageArgs", {arg1, arg2}},
-            {"Severity", "Warning"},
-            {"Resolution",
-             "Choose a value from the enumeration list that the implementation "
-             "can support and resubmit the request if the operation failed."}},
-        arg2);
+    addMessageToJson(res.jsonValue, propertyValueNotInList(arg1, arg2), arg2);
 }
 
 /**
@@ -500,20 +553,23 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json resourceAtUriInUnknownFormat(const std::string& arg1)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.ResourceAtUriInUnknownFormat"},
+        {"Message", "The resource at " + arg1 +
+                        " is in a format not recognized by the service."},
+        {"MessageArgs", {arg1}},
+        {"Severity", "Critical"},
+        {"Resolution", "Place an image or resource or file that is "
+                       "recognized by the service at the URI."}};
+}
+
 void resourceAtUriInUnknownFormat(crow::Response& res, const std::string& arg1)
 {
     res.result(boost::beast::http::status::bad_request);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.ResourceAtUriInUnknownFormat"},
-            {"Message", "The resource at " + arg1 +
-                            " is in a format not recognized by the service."},
-            {"MessageArgs", {arg1}},
-            {"Severity", "Critical"},
-            {"Resolution", "Place an image or resource or file that is "
-                           "recognized by the service at the URI."}});
+    addMessageToErrorJson(res.jsonValue, resourceAtUriInUnknownFormat(arg1));
 }
 
 /**
@@ -523,21 +579,24 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json serviceInUnknownState(void)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.ServiceInUnknownState"},
+        {"Message",
+         "The operation failed because the service is in an unknown state "
+         "and can no longer take incoming requests."},
+        {"MessageArgs", nlohmann::json::array()},
+        {"Severity", "Critical"},
+        {"Resolution", "Restart the service and resubmit the request if "
+                       "the operation failed."}};
+}
+
 void serviceInUnknownState(crow::Response& res)
 {
     res.result(boost::beast::http::status::service_unavailable);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.ServiceInUnknownState"},
-            {"Message",
-             "The operation failed because the service is in an unknown state "
-             "and can no longer take incoming requests."},
-            {"MessageArgs", nlohmann::json::array()},
-            {"Severity", "Critical"},
-            {"Resolution", "Restart the service and resubmit the request if "
-                           "the operation failed."}});
+    addMessageToErrorJson(res.jsonValue, serviceInUnknownState());
 }
 
 /**
@@ -547,23 +606,26 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json eventSubscriptionLimitExceeded(void)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.EventSubscriptionLimitExceeded"},
+        {"Message",
+         "The event subscription failed due to the number of simultaneous "
+         "subscriptions exceeding the limit of the implementation."},
+        {"MessageArgs", nlohmann::json::array()},
+        {"Severity", "Critical"},
+        {"Resolution",
+         "Reduce the number of other subscriptions before trying to "
+         "establish the event subscription or increase the limit of "
+         "simultaneous subscriptions (if supported)."}};
+}
+
 void eventSubscriptionLimitExceeded(crow::Response& res)
 {
     res.result(boost::beast::http::status::forbidden);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.EventSubscriptionLimitExceeded"},
-            {"Message",
-             "The event subscription failed due to the number of simultaneous "
-             "subscriptions exceeding the limit of the implementation."},
-            {"MessageArgs", nlohmann::json::array()},
-            {"Severity", "Critical"},
-            {"Resolution",
-             "Reduce the number of other subscriptions before trying to "
-             "establish the event subscription or increase the limit of "
-             "simultaneous subscriptions (if supported)."}});
+    addMessageToErrorJson(res.jsonValue, eventSubscriptionLimitExceeded());
 }
 
 /**
@@ -573,22 +635,26 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json actionParameterMissing(const std::string& arg1,
+                                      const std::string& arg2)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.ActionParameterMissing"},
+        {"Message", "The action " + arg1 + " requires the parameter " + arg2 +
+                        " to be present in the request body."},
+        {"MessageArgs", {arg1, arg2}},
+        {"Severity", "Critical"},
+        {"Resolution",
+         "Supply the action with the required parameter in the request "
+         "body when the request is resubmitted."}};
+}
+
 void actionParameterMissing(crow::Response& res, const std::string& arg1,
                             const std::string& arg2)
 {
     res.result(boost::beast::http::status::bad_request);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.ActionParameterMissing"},
-            {"Message", "The action " + arg1 + " requires the parameter " +
-                            arg2 + " to be present in the request body."},
-            {"MessageArgs", {arg1, arg2}},
-            {"Severity", "Critical"},
-            {"Resolution",
-             "Supply the action with the required parameter in the request "
-             "body when the request is resubmitted."}});
+    addMessageToErrorJson(res.jsonValue, actionParameterMissing(arg1, arg2));
 }
 
 /**
@@ -598,21 +664,24 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json stringValueTooLong(const std::string& arg1, const int& arg2)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.StringValueTooLong"},
+        {"Message", "The string " + arg1 + " exceeds the length limit " +
+                        std::to_string(arg2) + "."},
+        {"MessageArgs", {arg1, std::to_string(arg2)}},
+        {"Severity", "Warning"},
+        {"Resolution",
+         "Resubmit the request with an appropriate string length."}};
+}
+
 void stringValueTooLong(crow::Response& res, const std::string& arg1,
                         const int& arg2)
 {
     res.result(boost::beast::http::status::bad_request);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.StringValueTooLong"},
-            {"Message", "The string " + arg1 + " exceeds the length limit " +
-                            std::to_string(arg2) + "."},
-            {"MessageArgs", {arg1, std::to_string(arg2)}},
-            {"Severity", "Warning"},
-            {"Resolution",
-             "Resubmit the request with an appropriate string length."}});
+    addMessageToErrorJson(res.jsonValue, stringValueTooLong(arg1, arg2));
 }
 
 /**
@@ -622,18 +691,21 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json sessionTerminated(void)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.SessionTerminated"},
+        {"Message", "The session was successfully terminated."},
+        {"MessageArgs", nlohmann::json::array()},
+        {"Severity", "OK"},
+        {"Resolution", "No resolution is required."}};
+}
+
 void sessionTerminated(crow::Response& res)
 {
     res.result(boost::beast::http::status::ok);
-    addMessageToJsonRoot(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.SessionTerminated"},
-            {"Message", "The session was successfully terminated."},
-            {"MessageArgs", nlohmann::json::array()},
-            {"Severity", "OK"},
-            {"Resolution", "No resolution is required."}});
+    addMessageToJsonRoot(res.jsonValue, sessionTerminated());
 }
 
 /**
@@ -643,23 +715,27 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json resourceTypeIncompatible(const std::string& arg1,
+                                        const std::string& arg2)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.ResourceTypeIncompatible"},
+        {"Message", "The @odata.type of the request body " + arg1 +
+                        " is incompatible with the @odata.type of the "
+                        "resource which is " +
+                        arg2 + "."},
+        {"MessageArgs", {arg1, arg2}},
+        {"Severity", "Critical"},
+        {"Resolution", "Resubmit the request with a payload compatible "
+                       "with the resource's schema."}};
+}
+
 void resourceTypeIncompatible(crow::Response& res, const std::string& arg1,
                               const std::string& arg2)
 {
     res.result(boost::beast::http::status::bad_request);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.ResourceTypeIncompatible"},
-            {"Message", "The @odata.type of the request body " + arg1 +
-                            " is incompatible with the @odata.type of the "
-                            "resource which is " +
-                            arg2 + "."},
-            {"MessageArgs", {arg1, arg2}},
-            {"Severity", "Critical"},
-            {"Resolution", "Resubmit the request with a payload compatible "
-                           "with the resource's schema."}});
+    addMessageToErrorJson(res.jsonValue, resourceTypeIncompatible(arg1, arg2));
 }
 
 /**
@@ -670,24 +746,27 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json propertyValueTypeError(const std::string& arg1,
+                                      const std::string& arg2)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.PropertyValueTypeError"},
+        {"Message",
+         "The value " + arg1 + " for the property " + arg2 +
+             " is of a different type than the property can accept."},
+        {"MessageArgs", {arg1, arg2}},
+        {"Severity", "Warning"},
+        {"Resolution",
+         "Correct the value for the property in the request body and "
+         "resubmit the request if the operation failed."}};
+}
+
 void propertyValueTypeError(crow::Response& res, const std::string& arg1,
                             const std::string& arg2)
 {
     res.result(boost::beast::http::status::bad_request);
-    addMessageToJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.PropertyValueTypeError"},
-            {"Message",
-             "The value " + arg1 + " for the property " + arg2 +
-                 " is of a different type than the property can accept."},
-            {"MessageArgs", {arg1, arg2}},
-            {"Severity", "Warning"},
-            {"Resolution",
-             "Correct the value for the property in the request body and "
-             "resubmit the request if the operation failed."}},
-        arg2);
+    addMessageToJson(res.jsonValue, propertyValueTypeError(arg1, arg2), arg2);
 }
 
 /**
@@ -697,21 +776,25 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json resourceNotFound(const std::string& arg1,
+                                const std::string& arg2)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.ResourceNotFound"},
+        {"Message", "The requested resource of type " + arg1 + " named " +
+                        arg2 + " was not found."},
+        {"MessageArgs", {arg1, arg2}},
+        {"Severity", "Critical"},
+        {"Resolution",
+         "Provide a valid resource identifier and resubmit the request."}};
+}
+
 void resourceNotFound(crow::Response& res, const std::string& arg1,
                       const std::string& arg2)
 {
     res.result(boost::beast::http::status::not_found);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.ResourceNotFound"},
-            {"Message", "The requested resource of type " + arg1 + " named " +
-                            arg2 + " was not found."},
-            {"MessageArgs", {arg1, arg2}},
-            {"Severity", "Critical"},
-            {"Resolution",
-             "Provide a valid resource identifier and resubmit the request."}});
+    addMessageToErrorJson(res.jsonValue, resourceNotFound(arg1, arg2));
 }
 
 /**
@@ -721,22 +804,25 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json couldNotEstablishConnection(const std::string& arg1)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.CouldNotEstablishConnection"},
+        {"Message",
+         "The service failed to establish a Connection with the URI " + arg1 +
+             "."},
+        {"MessageArgs", {arg1}},
+        {"Severity", "Critical"},
+        {"Resolution",
+         "Ensure that the URI contains a valid and reachable node name, "
+         "protocol information and other URI components."}};
+}
+
 void couldNotEstablishConnection(crow::Response& res, const std::string& arg1)
 {
     res.result(boost::beast::http::status::not_found);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.CouldNotEstablishConnection"},
-            {"Message",
-             "The service failed to establish a Connection with the URI " +
-                 arg1 + "."},
-            {"MessageArgs", {arg1}},
-            {"Severity", "Critical"},
-            {"Resolution",
-             "Ensure that the URI contains a valid and reachable node name, "
-             "protocol information and other URI components."}});
+    addMessageToErrorJson(res.jsonValue, couldNotEstablishConnection(arg1));
 }
 
 /**
@@ -747,22 +833,24 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json propertyNotWritable(const std::string& arg1)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.PropertyNotWritable"},
+        {"Message", "The property " + arg1 +
+                        " is a read only property and cannot be "
+                        "assigned a value."},
+        {"MessageArgs", {arg1}},
+        {"Severity", "Warning"},
+        {"Resolution", "Remove the property from the request body and "
+                       "resubmit the request if the operation failed."}};
+}
+
 void propertyNotWritable(crow::Response& res, const std::string& arg1)
 {
     res.result(boost::beast::http::status::forbidden);
-    addMessageToJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.PropertyNotWritable"},
-            {"Message",
-             "The property " + arg1 +
-                 " is a read only property and cannot be assigned a value."},
-            {"MessageArgs", {arg1}},
-            {"Severity", "Warning"},
-            {"Resolution", "Remove the property from the request body and "
-                           "resubmit the request if the operation failed."}},
-        arg1);
+    addMessageToJson(res.jsonValue, propertyNotWritable(arg1), arg1);
 }
 
 /**
@@ -772,23 +860,28 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json queryParameterValueTypeError(const std::string& arg1,
+                                            const std::string& arg2)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.QueryParameterValueTypeError"},
+        {"Message",
+         "The value " + arg1 + " for the query parameter " + arg2 +
+             " is of a different type than the parameter can accept."},
+        {"MessageArgs", {arg1, arg2}},
+        {"Severity", "Warning"},
+        {"Resolution",
+         "Correct the value for the query parameter in the request and "
+         "resubmit the request if the operation failed."}};
+}
+
 void queryParameterValueTypeError(crow::Response& res, const std::string& arg1,
                                   const std::string& arg2)
 {
     res.result(boost::beast::http::status::bad_request);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.QueryParameterValueTypeError"},
-            {"Message",
-             "The value " + arg1 + " for the query parameter " + arg2 +
-                 " is of a different type than the parameter can accept."},
-            {"MessageArgs", {arg1, arg2}},
-            {"Severity", "Warning"},
-            {"Resolution",
-             "Correct the value for the query parameter in the request and "
-             "resubmit the request if the operation failed."}});
+    addMessageToErrorJson(res.jsonValue,
+                          queryParameterValueTypeError(arg1, arg2));
 }
 
 /**
@@ -798,20 +891,23 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json serviceShuttingDown(void)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.ServiceShuttingDown"},
+        {"Message", "The operation failed because the service is shutting "
+                    "down and can no longer take incoming requests."},
+        {"MessageArgs", nlohmann::json::array()},
+        {"Severity", "Critical"},
+        {"Resolution", "When the service becomes available, resubmit the "
+                       "request if the operation failed."}};
+}
+
 void serviceShuttingDown(crow::Response& res)
 {
     res.result(boost::beast::http::status::service_unavailable);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.ServiceShuttingDown"},
-            {"Message", "The operation failed because the service is shutting "
-                        "down and can no longer take incoming requests."},
-            {"MessageArgs", nlohmann::json::array()},
-            {"Severity", "Critical"},
-            {"Resolution", "When the service becomes available, resubmit the "
-                           "request if the operation failed."}});
+    addMessageToErrorJson(res.jsonValue, serviceShuttingDown());
 }
 
 /**
@@ -821,24 +917,28 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json actionParameterDuplicate(const std::string& arg1,
+                                        const std::string& arg2)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.ActionParameterDuplicate"},
+        {"Message",
+         "The action " + arg1 +
+             " was submitted with more than one value for the parameter " +
+             arg2 + "."},
+        {"MessageArgs", {arg1, arg2}},
+        {"Severity", "Warning"},
+        {"Resolution",
+         "Resubmit the action with only one instance of the parameter in "
+         "the request body if the operation failed."}};
+}
+
 void actionParameterDuplicate(crow::Response& res, const std::string& arg1,
                               const std::string& arg2)
 {
     res.result(boost::beast::http::status::bad_request);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.ActionParameterDuplicate"},
-            {"Message",
-             "The action " + arg1 +
-                 " was submitted with more than one value for the parameter " +
-                 arg2 + "."},
-            {"MessageArgs", {arg1, arg2}},
-            {"Severity", "Warning"},
-            {"Resolution",
-             "Resubmit the action with only one instance of the parameter in "
-             "the request body if the operation failed."}});
+    addMessageToErrorJson(res.jsonValue, actionParameterDuplicate(arg1, arg2));
 }
 
 /**
@@ -848,21 +948,26 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json actionParameterNotSupported(const std::string& arg1,
+                                           const std::string& arg2)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.ActionParameterNotSupported"},
+        {"Message", "The parameter " + arg1 + " for the action " + arg2 +
+                        " is not supported on the target resource."},
+        {"MessageArgs", {arg1, arg2}},
+        {"Severity", "Warning"},
+        {"Resolution", "Remove the parameter supplied and resubmit the "
+                       "request if the operation failed."}};
+}
+
 void actionParameterNotSupported(crow::Response& res, const std::string& arg1,
                                  const std::string& arg2)
 {
     res.result(boost::beast::http::status::bad_request);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.ActionParameterNotSupported"},
-            {"Message", "The parameter " + arg1 + " for the action " + arg2 +
-                            " is not supported on the target resource."},
-            {"MessageArgs", {arg1, arg2}},
-            {"Severity", "Warning"},
-            {"Resolution", "Remove the parameter supplied and resubmit the "
-                           "request if the operation failed."}});
+    addMessageToErrorJson(res.jsonValue,
+                          actionParameterNotSupported(arg1, arg2));
 }
 
 /**
@@ -872,21 +977,26 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json sourceDoesNotSupportProtocol(const std::string& arg1,
+                                            const std::string& arg2)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.SourceDoesNotSupportProtocol"},
+        {"Message", "The other end of the Connection at " + arg1 +
+                        " does not support the specified protocol " + arg2 +
+                        "."},
+        {"MessageArgs", {arg1, arg2}},
+        {"Severity", "Critical"},
+        {"Resolution", "Change protocols or URIs. "}};
+}
+
 void sourceDoesNotSupportProtocol(crow::Response& res, const std::string& arg1,
                                   const std::string& arg2)
 {
     res.result(boost::beast::http::status::bad_request);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.SourceDoesNotSupportProtocol"},
-            {"Message", "The other end of the Connection at " + arg1 +
-                            " does not support the specified protocol " + arg2 +
-                            "."},
-            {"MessageArgs", {arg1, arg2}},
-            {"Severity", "Critical"},
-            {"Resolution", "Change protocols or URIs. "}});
+    addMessageToErrorJson(res.jsonValue,
+                          sourceDoesNotSupportProtocol(arg1, arg2));
 }
 
 /**
@@ -896,18 +1006,21 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json accountRemoved(void)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.AccountRemoved"},
+        {"Message", "The account was successfully removed."},
+        {"MessageArgs", nlohmann::json::array()},
+        {"Severity", "OK"},
+        {"Resolution", "No resolution is required."}};
+}
+
 void accountRemoved(crow::Response& res)
 {
     res.result(boost::beast::http::status::ok);
-    addMessageToJsonRoot(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.AccountRemoved"},
-            {"Message", "The account was successfully removed."},
-            {"MessageArgs", nlohmann::json::array()},
-            {"Severity", "OK"},
-            {"Resolution", "No resolution is required."}});
+    addMessageToJsonRoot(res.jsonValue, accountRemoved());
 }
 
 /**
@@ -917,20 +1030,23 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json accessDenied(const std::string& arg1)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.AccessDenied"},
+        {"Message", "While attempting to establish a Connection to " + arg1 +
+                        ", the service denied access."},
+        {"MessageArgs", {arg1}},
+        {"Severity", "Critical"},
+        {"Resolution", "Attempt to ensure that the URI is correct and that "
+                       "the service has the appropriate credentials."}};
+}
+
 void accessDenied(crow::Response& res, const std::string& arg1)
 {
     res.result(boost::beast::http::status::forbidden);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.AccessDenied"},
-            {"Message", "While attempting to establish a Connection to " +
-                            arg1 + ", the service denied access."},
-            {"MessageArgs", {arg1}},
-            {"Severity", "Critical"},
-            {"Resolution", "Attempt to ensure that the URI is correct and that "
-                           "the service has the appropriate credentials."}});
+    addMessageToErrorJson(res.jsonValue, accessDenied(arg1));
 }
 
 /**
@@ -940,19 +1056,22 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json queryNotSupported(void)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.QueryNotSupported"},
+        {"Message", "Querying is not supported by the implementation."},
+        {"MessageArgs", nlohmann::json::array()},
+        {"Severity", "Warning"},
+        {"Resolution", "Remove the query parameters and resubmit the "
+                       "request if the operation failed."}};
+}
+
 void queryNotSupported(crow::Response& res)
 {
     res.result(boost::beast::http::status::bad_request);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.QueryNotSupported"},
-            {"Message", "Querying is not supported by the implementation."},
-            {"MessageArgs", nlohmann::json::array()},
-            {"Severity", "Warning"},
-            {"Resolution", "Remove the query parameters and resubmit the "
-                           "request if the operation failed."}});
+    addMessageToErrorJson(res.jsonValue, queryNotSupported());
 }
 
 /**
@@ -962,21 +1081,24 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json createLimitReachedForResource(void)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.CreateLimitReachedForResource"},
+        {"Message", "The create operation failed because the resource has "
+                    "reached the limit of possible resources."},
+        {"MessageArgs", nlohmann::json::array()},
+        {"Severity", "Critical"},
+        {"Resolution",
+         "Either delete resources and resubmit the request if the "
+         "operation failed or do not resubmit the request."}};
+}
+
 void createLimitReachedForResource(crow::Response& res)
 {
     res.result(boost::beast::http::status::bad_request);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.CreateLimitReachedForResource"},
-            {"Message", "The create operation failed because the resource has "
-                        "reached the limit of possible resources."},
-            {"MessageArgs", nlohmann::json::array()},
-            {"Severity", "Critical"},
-            {"Resolution",
-             "Either delete resources and resubmit the request if the "
-             "operation failed or do not resubmit the request."}});
+    addMessageToErrorJson(res.jsonValue, createLimitReachedForResource());
 }
 
 /**
@@ -986,19 +1108,22 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json generalError(void)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.GeneralError"},
+        {"Message", "A general error has occurred. See Resolution for "
+                    "information on how to resolve the error."},
+        {"MessageArgs", nlohmann::json::array()},
+        {"Severity", "Critical"},
+        {"Resolution", "None."}};
+}
+
 void generalError(crow::Response& res)
 {
     res.result(boost::beast::http::status::internal_server_error);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.GeneralError"},
-            {"Message", "A general error has occurred. See Resolution for "
-                        "information on how to resolve the error."},
-            {"MessageArgs", nlohmann::json::array()},
-            {"Severity", "Critical"},
-            {"Resolution", "None."}});
+    addMessageToErrorJson(res.jsonValue, generalError());
 }
 
 /**
@@ -1008,19 +1133,22 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json success(void)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.Success"},
+        {"Message", "Successfully Completed Request"},
+        {"MessageArgs", nlohmann::json::array()},
+        {"Severity", "OK"},
+        {"Resolution", "None"}};
+}
+
 void success(crow::Response& res)
 {
-    // don't set res.result here because success is the default and any error
-    // should overwrite the default
-    addMessageToJsonRoot(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.Success"},
-            {"Message", "Successfully Completed Request"},
-            {"MessageArgs", nlohmann::json::array()},
-            {"Severity", "OK"},
-            {"Resolution", "None"}});
+    // don't set res.result here because success is the default and any
+    // error should overwrite the default
+    addMessageToJsonRoot(res.jsonValue, success());
 }
 
 /**
@@ -1030,18 +1158,21 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json created(void)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.Created"},
+        {"Message", "The resource has been created successfully"},
+        {"MessageArgs", nlohmann::json::array()},
+        {"Severity", "OK"},
+        {"Resolution", "None"}};
+}
+
 void created(crow::Response& res)
 {
     res.result(boost::beast::http::status::created);
-    addMessageToJsonRoot(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.Created"},
-            {"Message", "The resource has been created successfully"},
-            {"MessageArgs", nlohmann::json::array()},
-            {"Severity", "OK"},
-            {"Resolution", "None"}});
+    addMessageToJsonRoot(res.jsonValue, created());
 }
 
 /**
@@ -1051,46 +1182,52 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json noOperation(void)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.NoOperation"},
+        {"Message", "The request body submitted contain no data to act "
+                    "upon and no changes to the resource took place."},
+        {"MessageArgs", nlohmann::json::array()},
+        {"Severity", "Warning"},
+        {"Resolution",
+         "Add properties in the JSON object and resubmit the request."}};
+}
+
 void noOperation(crow::Response& res)
 {
     res.result(boost::beast::http::status::bad_request);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.NoOperation"},
-            {"Message", "The request body submitted contain no data to act "
-                        "upon and no changes to the resource took place."},
-            {"MessageArgs", nlohmann::json::array()},
-            {"Severity", "Warning"},
-            {"Resolution",
-             "Add properties in the JSON object and resubmit the request."}});
+    addMessageToErrorJson(res.jsonValue, noOperation());
 }
 
 /**
  * @internal
- * @brief Formats PropertyUnknown message into JSON for the specified property
+ * @brief Formats PropertyUnknown message into JSON for the specified
+ * property
  *
  * See header file for more information
  * @endinternal
  */
+nlohmann::json propertyUnknown(const std::string& arg1)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.PropertyUnknown"},
+        {"Message", "The property " + arg1 +
+                        " is not in the list of valid properties for "
+                        "the resource."},
+        {"MessageArgs", {arg1}},
+        {"Severity", "Warning"},
+        {"Resolution", "Remove the unknown property from the request "
+                       "body and resubmit "
+                       "the request if the operation failed."}};
+}
+
 void propertyUnknown(crow::Response& res, const std::string& arg1)
 {
     res.result(boost::beast::http::status::bad_request);
-    addMessageToJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.PropertyUnknown"},
-            {"Message",
-             "The property " + arg1 +
-                 " is not in the list of valid properties for the resource."},
-            {"MessageArgs", {arg1}},
-            {"Severity", "Warning"},
-            {"Resolution",
-             "Remove the unknown property from the request body and resubmit "
-             "the request if the operation failed."}},
-        arg1);
+    addMessageToJson(res.jsonValue, propertyUnknown(arg1), arg1);
 }
 
 /**
@@ -1100,20 +1237,23 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json noValidSession(void)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.NoValidSession"},
+        {"Message",
+         "There is no valid session established with the implementation."},
+        {"MessageArgs", nlohmann::json::array()},
+        {"Severity", "Critical"},
+        {"Resolution",
+         "Establish as session before attempting any operations."}};
+}
+
 void noValidSession(crow::Response& res)
 {
     res.result(boost::beast::http::status::forbidden);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.NoValidSession"},
-            {"Message",
-             "There is no valid session established with the implementation."},
-            {"MessageArgs", nlohmann::json::array()},
-            {"Severity", "Critical"},
-            {"Resolution",
-             "Establish as session before attempting any operations."}});
+    addMessageToErrorJson(res.jsonValue, noValidSession());
 }
 
 /**
@@ -1123,20 +1263,23 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json invalidObject(const std::string& arg1)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.InvalidObject"},
+        {"Message", "The object at " + arg1 + " is invalid."},
+        {"MessageArgs", {arg1}},
+        {"Severity", "Critical"},
+        {"Resolution",
+         "Either the object is malformed or the URI is not correct.  "
+         "Correct the condition and resubmit the request if it failed."}};
+}
+
 void invalidObject(crow::Response& res, const std::string& arg1)
 {
     res.result(boost::beast::http::status::bad_request);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.InvalidObject"},
-            {"Message", "The object at " + arg1 + " is invalid."},
-            {"MessageArgs", {arg1}},
-            {"Severity", "Critical"},
-            {"Resolution",
-             "Either the object is malformed or the URI is not correct.  "
-             "Correct the condition and resubmit the request if it failed."}});
+    addMessageToErrorJson(res.jsonValue, invalidObject(arg1));
 }
 
 /**
@@ -1146,20 +1289,23 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json resourceInStandby(void)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.ResourceInStandby"},
+        {"Message", "The request could not be performed because the "
+                    "resource is in standby."},
+        {"MessageArgs", nlohmann::json::array()},
+        {"Severity", "Critical"},
+        {"Resolution", "Ensure that the resource is in the correct power "
+                       "state and resubmit the request."}};
+}
+
 void resourceInStandby(crow::Response& res)
 {
     res.result(boost::beast::http::status::service_unavailable);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.ResourceInStandby"},
-            {"Message", "The request could not be performed because the "
-                        "resource is in standby."},
-            {"MessageArgs", nlohmann::json::array()},
-            {"Severity", "Critical"},
-            {"Resolution", "Ensure that the resource is in the correct power "
-                           "state and resubmit the request."}});
+    addMessageToErrorJson(res.jsonValue, resourceInStandby());
 }
 
 /**
@@ -1169,25 +1315,31 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json actionParameterValueTypeError(const std::string& arg1,
+                                             const std::string& arg2,
+                                             const std::string& arg3)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.ActionParameterValueTypeError"},
+        {"Message",
+         "The value " + arg1 + " for the parameter " + arg2 +
+             " in the action " + arg3 +
+             " is of a different type than the parameter can accept."},
+        {"MessageArgs", {arg1, arg2, arg3}},
+        {"Severity", "Warning"},
+        {"Resolution",
+         "Correct the value for the parameter in the request body and "
+         "resubmit the request if the operation failed."}};
+}
+
 void actionParameterValueTypeError(crow::Response& res, const std::string& arg1,
                                    const std::string& arg2,
                                    const std::string& arg3)
 {
     res.result(boost::beast::http::status::bad_request);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.ActionParameterValueTypeError"},
-            {"Message",
-             "The value " + arg1 + " for the parameter " + arg2 +
-                 " in the action " + arg3 +
-                 " is of a different type than the parameter can accept."},
-            {"MessageArgs", {arg1, arg2, arg3}},
-            {"Severity", "Warning"},
-            {"Resolution",
-             "Correct the value for the parameter in the request body and "
-             "resubmit the request if the operation failed."}});
+    addMessageToErrorJson(res.jsonValue,
+                          actionParameterValueTypeError(arg1, arg2, arg3));
 }
 
 /**
@@ -1197,22 +1349,25 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json sessionLimitExceeded(void)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.SessionLimitExceeded"},
+        {"Message", "The session establishment failed due to the number of "
+                    "simultaneous sessions exceeding the limit of the "
+                    "implementation."},
+        {"MessageArgs", nlohmann::json::array()},
+        {"Severity", "Critical"},
+        {"Resolution", "Reduce the number of other sessions before trying "
+                       "to establish the session or increase the limit of "
+                       "simultaneous sessions (if supported)."}};
+}
+
 void sessionLimitExceeded(crow::Response& res)
 {
     res.result(boost::beast::http::status::service_unavailable);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.SessionLimitExceeded"},
-            {"Message", "The session establishment failed due to the number of "
-                        "simultaneous sessions exceeding the limit of the "
-                        "implementation."},
-            {"MessageArgs", nlohmann::json::array()},
-            {"Severity", "Critical"},
-            {"Resolution", "Reduce the number of other sessions before trying "
-                           "to establish the session or increase the limit of "
-                           "simultaneous sessions (if supported)."}});
+    addMessageToErrorJson(res.jsonValue, sessionLimitExceeded());
 }
 
 /**
@@ -1222,23 +1377,26 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json actionNotSupported(const std::string& arg1)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.ActionNotSupported"},
+        {"Message",
+         "The action " + arg1 + " is not supported by the resource."},
+        {"MessageArgs", {arg1}},
+        {"Severity", "Critical"},
+        {"Resolution",
+         "The action supplied cannot be resubmitted to the implementation. "
+         " Perhaps the action was invalid, the wrong resource was the "
+         "target or the implementation documentation may be of "
+         "assistance."}};
+}
+
 void actionNotSupported(crow::Response& res, const std::string& arg1)
 {
     res.result(boost::beast::http::status::bad_request);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.ActionNotSupported"},
-            {"Message",
-             "The action " + arg1 + " is not supported by the resource."},
-            {"MessageArgs", {arg1}},
-            {"Severity", "Critical"},
-            {"Resolution",
-             "The action supplied cannot be resubmitted to the implementation. "
-             " Perhaps the action was invalid, the wrong resource was the "
-             "target or the implementation documentation may be of "
-             "assistance."}});
+    addMessageToErrorJson(res.jsonValue, actionNotSupported(arg1));
 }
 
 /**
@@ -1248,20 +1406,23 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json invalidIndex(const int& arg1)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.InvalidIndex"},
+        {"Message", "The index " + std::to_string(arg1) +
+                        " is not a valid offset into the array."},
+        {"MessageArgs", {std::to_string(arg1)}},
+        {"Severity", "Warning"},
+        {"Resolution", "Verify the index value provided is within the "
+                       "bounds of the array."}};
+}
+
 void invalidIndex(crow::Response& res, const int& arg1)
 {
     res.result(boost::beast::http::status::bad_request);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.InvalidIndex"},
-            {"Message", "The index " + std::to_string(arg1) +
-                            " is not a valid offset into the array."},
-            {"MessageArgs", {std::to_string(arg1)}},
-            {"Severity", "Warning"},
-            {"Resolution", "Verify the index value provided is within the "
-                           "bounds of the array."}});
+    addMessageToErrorJson(res.jsonValue, invalidIndex(arg1));
 }
 
 /**
@@ -1271,20 +1432,23 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json emptyJSON(void)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.EmptyJSON"},
+        {"Message", "The request body submitted contained an empty JSON "
+                    "object and the service is unable to process it."},
+        {"MessageArgs", nlohmann::json::array()},
+        {"Severity", "Warning"},
+        {"Resolution",
+         "Add properties in the JSON object and resubmit the request."}};
+}
+
 void emptyJSON(crow::Response& res)
 {
     res.result(boost::beast::http::status::bad_request);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.EmptyJSON"},
-            {"Message", "The request body submitted contained an empty JSON "
-                        "object and the service is unable to process it."},
-            {"MessageArgs", nlohmann::json::array()},
-            {"Severity", "Warning"},
-            {"Resolution",
-             "Add properties in the JSON object and resubmit the request."}});
+    addMessageToErrorJson(res.jsonValue, emptyJSON());
 }
 
 /**
@@ -1294,19 +1458,22 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json queryNotSupportedOnResource(void)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.QueryNotSupportedOnResource"},
+        {"Message", "Querying is not supported on the requested resource."},
+        {"MessageArgs", nlohmann::json::array()},
+        {"Severity", "Warning"},
+        {"Resolution", "Remove the query parameters and resubmit the "
+                       "request if the operation failed."}};
+}
+
 void queryNotSupportedOnResource(crow::Response& res)
 {
     res.result(boost::beast::http::status::forbidden);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.QueryNotSupportedOnResource"},
-            {"Message", "Querying is not supported on the requested resource."},
-            {"MessageArgs", nlohmann::json::array()},
-            {"Severity", "Warning"},
-            {"Resolution", "Remove the query parameters and resubmit the "
-                           "request if the operation failed."}});
+    addMessageToErrorJson(res.jsonValue, queryNotSupportedOnResource());
 }
 
 /**
@@ -1316,22 +1483,25 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json insufficientPrivilege(void)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.InsufficientPrivilege"},
+        {"Message", "There are insufficient privileges for the account or "
+                    "credentials associated with the current session to "
+                    "perform the requested operation."},
+        {"MessageArgs", nlohmann::json::array()},
+        {"Severity", "Critical"},
+        {"Resolution",
+         "Either abandon the operation or change the associated access "
+         "rights and resubmit the request if the operation failed."}};
+}
+
 void insufficientPrivilege(crow::Response& res)
 {
     res.result(boost::beast::http::status::forbidden);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.InsufficientPrivilege"},
-            {"Message", "There are insufficient privileges for the account or "
-                        "credentials associated with the current session to "
-                        "perform the requested operation."},
-            {"MessageArgs", nlohmann::json::array()},
-            {"Severity", "Critical"},
-            {"Resolution",
-             "Either abandon the operation or change the associated access "
-             "rights and resubmit the request if the operation failed."}});
+    addMessageToErrorJson(res.jsonValue, insufficientPrivilege());
 }
 
 /**
@@ -1341,21 +1511,24 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json propertyValueModified(const std::string& arg1,
+                                     const std::string& arg2)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.PropertyValueModified"},
+        {"Message", "The property " + arg1 + " was assigned the value " + arg2 +
+                        " due to modification by the service."},
+        {"MessageArgs", {arg1, arg2}},
+        {"Severity", "Warning"},
+        {"Resolution", "No resolution is required."}};
+}
+
 void propertyValueModified(crow::Response& res, const std::string& arg1,
                            const std::string& arg2)
 {
     res.result(boost::beast::http::status::ok);
-    addMessageToJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.PropertyValueModified"},
-            {"Message", "The property " + arg1 + " was assigned the value " +
-                            arg2 + " due to modification by the service."},
-            {"MessageArgs", {arg1, arg2}},
-            {"Severity", "Warning"},
-            {"Resolution", "No resolution is required."}},
-        arg1);
+    addMessageToJson(res.jsonValue, propertyValueModified(arg1, arg2), arg1);
 }
 
 /**
@@ -1365,19 +1538,22 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json accountNotModified(void)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.AccountNotModified"},
+        {"Message", "The account modification request failed."},
+        {"MessageArgs", nlohmann::json::array()},
+        {"Severity", "Warning"},
+        {"Resolution", "The modification may have failed due to permission "
+                       "issues or issues with the request body."}};
+}
+
 void accountNotModified(crow::Response& res)
 {
     res.result(boost::beast::http::status::bad_request);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.AccountNotModified"},
-            {"Message", "The account modification request failed."},
-            {"MessageArgs", nlohmann::json::array()},
-            {"Severity", "Warning"},
-            {"Resolution", "The modification may have failed due to permission "
-                           "issues or issues with the request body."}});
+    addMessageToErrorJson(res.jsonValue, accountNotModified());
 }
 
 /**
@@ -1387,50 +1563,59 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json queryParameterValueFormatError(const std::string& arg1,
+                                              const std::string& arg2)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.QueryParameterValueFormatError"},
+        {"Message",
+         "The value " + arg1 + " for the parameter " + arg2 +
+             " is of a different format than the parameter can accept."},
+        {"MessageArgs", {arg1, arg2}},
+        {"Severity", "Warning"},
+        {"Resolution",
+         "Correct the value for the query parameter in the request and "
+         "resubmit the request if the operation failed."}};
+}
+
 void queryParameterValueFormatError(crow::Response& res,
                                     const std::string& arg1,
                                     const std::string& arg2)
 {
     res.result(boost::beast::http::status::bad_request);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.QueryParameterValueFormatError"},
-            {"Message",
-             "The value " + arg1 + " for the parameter " + arg2 +
-                 " is of a different format than the parameter can accept."},
-            {"MessageArgs", {arg1, arg2}},
-            {"Severity", "Warning"},
-            {"Resolution",
-             "Correct the value for the query parameter in the request and "
-             "resubmit the request if the operation failed."}});
+    addMessageToErrorJson(res.jsonValue,
+                          queryParameterValueFormatError(arg1, arg2));
 }
 
 /**
  * @internal
- * @brief Formats PropertyMissing message into JSON for the specified property
+ * @brief Formats PropertyMissing message into JSON for the specified
+ * property
  *
  * See header file for more information
  * @endinternal
  */
+nlohmann::json propertyMissing(const std::string& arg1)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.PropertyMissing"},
+        {"Message", "The property " + arg1 +
+                        " is a required property and must be included in "
+                        "the request."},
+        {"MessageArgs", {arg1}},
+        {"Severity", "Warning"},
+        {"Resolution",
+         "Ensure that the property is in the request body and has a "
+         "valid "
+         "value and resubmit the request if the operation failed."}};
+}
+
 void propertyMissing(crow::Response& res, const std::string& arg1)
 {
     res.result(boost::beast::http::status::bad_request);
-    addMessageToJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.PropertyMissing"},
-            {"Message", "The property " + arg1 +
-                            " is a required property and must be included in "
-                            "the request."},
-            {"MessageArgs", {arg1}},
-            {"Severity", "Warning"},
-            {"Resolution",
-             "Ensure that the property is in the request body and has a valid "
-             "value and resubmit the request if the operation failed."}},
-        arg1);
+    addMessageToJson(res.jsonValue, propertyMissing(arg1), arg1);
 }
 
 /**
@@ -1440,21 +1625,24 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json resourceExhaustion(const std::string& arg1)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.ResourceExhaustion"},
+        {"Message", "The resource " + arg1 +
+                        " was unable to satisfy the request due to "
+                        "unavailability of resources."},
+        {"MessageArgs", {arg1}},
+        {"Severity", "Critical"},
+        {"Resolution", "Ensure that the resources are available and "
+                       "resubmit the request."}};
+}
+
 void resourceExhaustion(crow::Response& res, const std::string& arg1)
 {
     res.result(boost::beast::http::status::service_unavailable);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.ResourceExhaustion"},
-            {"Message", "The resource " + arg1 +
-                            " was unable to satisfy the request due to "
-                            "unavailability of resources."},
-            {"MessageArgs", {arg1}},
-            {"Severity", "Critical"},
-            {"Resolution", "Ensure that the resources are available and "
-                           "resubmit the request."}});
+    addMessageToErrorJson(res.jsonValue, resourceExhaustion(arg1));
 }
 
 /**
@@ -1464,18 +1652,21 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json accountModified(void)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.AccountModified"},
+        {"Message", "The account was successfully modified."},
+        {"MessageArgs", nlohmann::json::array()},
+        {"Severity", "OK"},
+        {"Resolution", "No resolution is required."}};
+}
+
 void accountModified(crow::Response& res)
 {
     res.result(boost::beast::http::status::ok);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.AccountModified"},
-            {"Message", "The account was successfully modified."},
-            {"MessageArgs", nlohmann::json::array()},
-            {"Severity", "OK"},
-            {"Resolution", "No resolution is required."}});
+    addMessageToErrorJson(res.jsonValue, accountModified());
 }
 
 /**
@@ -1485,24 +1676,30 @@
  * See header file for more information
  * @endinternal
  */
+nlohmann::json queryParameterOutOfRange(const std::string& arg1,
+                                        const std::string& arg2,
+                                        const std::string& arg3)
+{
+    return nlohmann::json{
+        {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
+        {"MessageId", "Base.1.4.0.QueryParameterOutOfRange"},
+        {"Message", "The value " + arg1 + " for the query parameter " + arg2 +
+                        " is out of range " + arg3 + "."},
+        {"MessageArgs", {arg1, arg2, arg3}},
+        {"Severity", "Warning"},
+        {"Resolution",
+         "Reduce the value for the query parameter to a value that is "
+         "within range, such as a start or count value that is within "
+         "bounds of the number of resources in a collection or a page that "
+         "is within the range of valid pages."}};
+}
+
 void queryParameterOutOfRange(crow::Response& res, const std::string& arg1,
                               const std::string& arg2, const std::string& arg3)
 {
     res.result(boost::beast::http::status::bad_request);
-    addMessageToErrorJson(
-        res.jsonValue,
-        nlohmann::json{
-            {"@odata.type", "/redfish/v1/$metadata#Message.v1_0_0.Message"},
-            {"MessageId", "Base.1.4.0.QueryParameterOutOfRange"},
-            {"Message", "The value " + arg1 + " for the query parameter " +
-                            arg2 + " is out of range " + arg3 + "."},
-            {"MessageArgs", {arg1, arg2, arg3}},
-            {"Severity", "Warning"},
-            {"Resolution",
-             "Reduce the value for the query parameter to a value that is "
-             "within range, such as a start or count value that is within "
-             "bounds of the number of resources in a collection or a page that "
-             "is within the range of valid pages."}});
+    addMessageToErrorJson(res.jsonValue,
+                          queryParameterOutOfRange(arg1, arg2, arg3));
 }
 
 } // namespace messages
