diff --git a/redfish-core/include/event_service_manager.hpp b/redfish-core/include/event_service_manager.hpp
index 21b25e4..7ece888 100644
--- a/redfish-core/include/event_service_manager.hpp
+++ b/redfish-core/include/event_service_manager.hpp
@@ -217,7 +217,7 @@
                                const std::string& messageID,
                                const std::vector<std::string>& messageArgs,
                                std::string timestamp,
-                               const std::string customText,
+                               const std::string& customText,
                                nlohmann::json& logEntryJson)
 {
     // Get the Message from the MessageRegistry
@@ -924,7 +924,7 @@
         return subValue;
     }
 
-    std::string addSubscription(const std::shared_ptr<Subscription> subValue,
+    std::string addSubscription(const std::shared_ptr<Subscription>& subValue,
                                 const bool updateFile = true)
     {
 
diff --git a/redfish-core/include/utils/fw_utils.hpp b/redfish-core/include/utils/fw_utils.hpp
index 5554d3b..6a2ca14 100644
--- a/redfish-core/include/utils/fw_utils.hpp
+++ b/redfish-core/include/utils/fw_utils.hpp
@@ -31,9 +31,11 @@
  *
  * @return void
  */
-inline void populateFirmwareInformation(
-    std::shared_ptr<AsyncResp> aResp, const std::string& fwVersionPurpose,
-    const std::string& activeVersionPropName, const bool populateLinkToImages)
+inline void
+    populateFirmwareInformation(const std::shared_ptr<AsyncResp>& aResp,
+                                const std::string& fwVersionPurpose,
+                                const std::string& activeVersionPropName,
+                                const bool populateLinkToImages)
 {
     // Used later to determine running (known on Redfish as active) FW images
     crow::connections::systemBus->async_method_call(
@@ -334,8 +336,8 @@
  *
  * @return void
  */
-inline void getFwStatus(std::shared_ptr<AsyncResp> asyncResp,
-                        const std::shared_ptr<std::string> swId,
+inline void getFwStatus(const std::shared_ptr<AsyncResp>& asyncResp,
+                        const std::shared_ptr<std::string>& swId,
                         const std::string& dbusSvc)
 {
     BMCWEB_LOG_DEBUG << "getFwStatus: swId " << *swId << " svc " << dbusSvc;
@@ -392,8 +394,8 @@
  * @param[i,o] asyncResp  Async response object
  * @param[i]   fwId       The firmware ID
  */
-inline void getFwUpdateableStatus(std::shared_ptr<AsyncResp> asyncResp,
-                                  const std::shared_ptr<std::string> fwId)
+inline void getFwUpdateableStatus(const std::shared_ptr<AsyncResp>& asyncResp,
+                                  const std::shared_ptr<std::string>& fwId)
 {
     crow::connections::systemBus->async_method_call(
         [asyncResp, fwId](const boost::system::error_code ec,
diff --git a/redfish-core/lib/account_service.hpp b/redfish-core/lib/account_service.hpp
index 266843e..23c7fb9 100644
--- a/redfish-core/lib/account_service.hpp
+++ b/redfish-core/lib/account_service.hpp
@@ -119,7 +119,7 @@
 }
 
 inline void userErrorMessageHandler(const sd_bus_error* e,
-                                    std::shared_ptr<AsyncResp> asyncResp,
+                                    const std::shared_ptr<AsyncResp>& asyncResp,
                                     const std::string& newUser,
                                     const std::string& username)
 {
@@ -1038,87 +1038,87 @@
 
         // Get the existing resource first then keep modifying
         // whenever any property gets updated.
-        getLDAPConfigData(serverType, [this, asyncResp, userName, password,
-                                       baseDNList, userNameAttribute,
-                                       groupsAttribute, serviceAddressList,
-                                       serviceEnabled, dbusObjectPath,
-                                       remoteRoleMapData](
-                                          bool success, LDAPConfigData confData,
-                                          const std::string& serverT) {
-            if (!success)
-            {
-                messages::internalError(asyncResp->res);
-                return;
-            }
-            parseLDAPConfigData(asyncResp->res.jsonValue, confData, serverT);
-            if (confData.serviceEnabled)
-            {
-                // Disable the service first and update the rest of
-                // the properties.
-                handleServiceEnablePatch(false, asyncResp, serverT,
-                                         dbusObjectPath);
-            }
-
-            if (serviceAddressList)
-            {
-                handleServiceAddressPatch(*serviceAddressList, asyncResp,
-                                          serverT, dbusObjectPath);
-            }
-            if (userName)
-            {
-                handleUserNamePatch(*userName, asyncResp, serverT,
-                                    dbusObjectPath);
-            }
-            if (password)
-            {
-                handlePasswordPatch(*password, asyncResp, serverT,
-                                    dbusObjectPath);
-            }
-
-            if (baseDNList)
-            {
-                handleBaseDNPatch(*baseDNList, asyncResp, serverT,
-                                  dbusObjectPath);
-            }
-            if (userNameAttribute)
-            {
-                handleUserNameAttrPatch(*userNameAttribute, asyncResp, serverT,
-                                        dbusObjectPath);
-            }
-            if (groupsAttribute)
-            {
-                handleGroupNameAttrPatch(*groupsAttribute, asyncResp, serverT,
-                                         dbusObjectPath);
-            }
-            if (serviceEnabled)
-            {
-                // if user has given the value as true then enable
-                // the service. if user has given false then no-op
-                // as service is already stopped.
-                if (*serviceEnabled)
+        getLDAPConfigData(
+            serverType, [this, asyncResp, userName, password, baseDNList,
+                         userNameAttribute, groupsAttribute, serviceAddressList,
+                         serviceEnabled, dbusObjectPath, remoteRoleMapData](
+                            bool success, const LDAPConfigData& confData,
+                            const std::string& serverT) {
+                if (!success)
                 {
-                    handleServiceEnablePatch(*serviceEnabled, asyncResp,
+                    messages::internalError(asyncResp->res);
+                    return;
+                }
+                parseLDAPConfigData(asyncResp->res.jsonValue, confData,
+                                    serverT);
+                if (confData.serviceEnabled)
+                {
+                    // Disable the service first and update the rest of
+                    // the properties.
+                    handleServiceEnablePatch(false, asyncResp, serverT,
+                                             dbusObjectPath);
+                }
+
+                if (serviceAddressList)
+                {
+                    handleServiceAddressPatch(*serviceAddressList, asyncResp,
+                                              serverT, dbusObjectPath);
+                }
+                if (userName)
+                {
+                    handleUserNamePatch(*userName, asyncResp, serverT,
+                                        dbusObjectPath);
+                }
+                if (password)
+                {
+                    handlePasswordPatch(*password, asyncResp, serverT,
+                                        dbusObjectPath);
+                }
+
+                if (baseDNList)
+                {
+                    handleBaseDNPatch(*baseDNList, asyncResp, serverT,
+                                      dbusObjectPath);
+                }
+                if (userNameAttribute)
+                {
+                    handleUserNameAttrPatch(*userNameAttribute, asyncResp,
+                                            serverT, dbusObjectPath);
+                }
+                if (groupsAttribute)
+                {
+                    handleGroupNameAttrPatch(*groupsAttribute, asyncResp,
                                              serverT, dbusObjectPath);
                 }
-            }
-            else
-            {
-                // if user has not given the service enabled value
-                // then revert it to the same state as it was
-                // before.
-                handleServiceEnablePatch(confData.serviceEnabled, asyncResp,
-                                         serverT, dbusObjectPath);
-            }
+                if (serviceEnabled)
+                {
+                    // if user has given the value as true then enable
+                    // the service. if user has given false then no-op
+                    // as service is already stopped.
+                    if (*serviceEnabled)
+                    {
+                        handleServiceEnablePatch(*serviceEnabled, asyncResp,
+                                                 serverT, dbusObjectPath);
+                    }
+                }
+                else
+                {
+                    // if user has not given the service enabled value
+                    // then revert it to the same state as it was
+                    // before.
+                    handleServiceEnablePatch(confData.serviceEnabled, asyncResp,
+                                             serverT, dbusObjectPath);
+                }
 
-            if (remoteRoleMapData)
-            {
-                std::vector<nlohmann::json> remoteRoleMap =
-                    std::move(*remoteRoleMapData);
+                if (remoteRoleMapData)
+                {
+                    std::vector<nlohmann::json> remoteRoleMap =
+                        std::move(*remoteRoleMapData);
 
-                handleRoleMapPatch(asyncResp, confData.groupRoleList, serverT,
-                                   remoteRoleMap);
-            }
-        });
+                    handleRoleMapPatch(asyncResp, confData.groupRoleList,
+                                       serverT, remoteRoleMap);
+                }
+            });
     }
 
     void doGet(crow::Response& res, const crow::Request&,
diff --git a/redfish-core/lib/chassis.hpp b/redfish-core/lib/chassis.hpp
index b0690c8..eaa9ff8 100644
--- a/redfish-core/lib/chassis.hpp
+++ b/redfish-core/lib/chassis.hpp
@@ -531,7 +531,7 @@
     }
 };
 
-inline void doChassisPowerCycle(std::shared_ptr<AsyncResp> asyncResp)
+inline void doChassisPowerCycle(const std::shared_ptr<AsyncResp>& asyncResp)
 {
     const char* processName = "xyz.openbmc_project.State.Chassis";
     const char* objectPath = "/xyz/openbmc_project/state/chassis0";
diff --git a/redfish-core/lib/cpudimm.hpp b/redfish-core/lib/cpudimm.hpp
index e4b7a9d..7a306a3 100644
--- a/redfish-core/lib/cpudimm.hpp
+++ b/redfish-core/lib/cpudimm.hpp
@@ -70,7 +70,7 @@
 }
 
 inline void
-    getCpuDataByInterface(std::shared_ptr<AsyncResp> aResp,
+    getCpuDataByInterface(const std::shared_ptr<AsyncResp>& aResp,
                           const InterfacesProperties& cpuInterfacesProperties)
 {
     BMCWEB_LOG_DEBUG << "Get CPU resources by interface.";
@@ -410,7 +410,7 @@
 
 inline void getCpuData(std::shared_ptr<AsyncResp> aResp,
                        const std::string& cpuId,
-                       const std::vector<const char*> inventoryItems)
+                       const std::vector<const char*>& inventoryItems)
 {
     BMCWEB_LOG_DEBUG << "Get available system cpu resources.";
 
@@ -481,7 +481,8 @@
 
 using DimmProperties = boost::container::flat_map<std::string, DimmProperty>;
 
-inline void dimmPropToHex(std::shared_ptr<AsyncResp> aResp, const char* key,
+inline void dimmPropToHex(const std::shared_ptr<AsyncResp>& aResp,
+                          const char* key,
                           const std::pair<std::string, DimmProperty>& property)
 {
     const uint16_t* value = std::get_if<uint16_t>(&property.second);
@@ -495,8 +496,9 @@
     aResp->res.jsonValue[key] = (boost::format("0x%04x") % *value).str();
 }
 
-inline void getPersistentMemoryProperties(std::shared_ptr<AsyncResp> aResp,
-                                          const DimmProperties& properties)
+inline void
+    getPersistentMemoryProperties(const std::shared_ptr<AsyncResp>& aResp,
+                                  const DimmProperties& properties)
 {
     for (const auto& property : properties)
     {
diff --git a/redfish-core/lib/ethernet.hpp b/redfish-core/lib/ethernet.hpp
index 1fb8783..05f5d55 100644
--- a/redfish-core/lib/ethernet.hpp
+++ b/redfish-core/lib/ethernet.hpp
@@ -697,7 +697,7 @@
  * @return None
  */
 inline void deleteIPv4(const std::string& ifaceId, const std::string& ipHash,
-                       const std::shared_ptr<AsyncResp> asyncResp)
+                       const std::shared_ptr<AsyncResp>& asyncResp)
 {
     crow::connections::systemBus->async_method_call(
         [asyncResp](const boost::system::error_code ec) {
@@ -724,7 +724,7 @@
  */
 inline void createIPv4(const std::string& ifaceId, uint8_t prefixLength,
                        const std::string& gateway, const std::string& address,
-                       std::shared_ptr<AsyncResp> asyncResp)
+                       const std::shared_ptr<AsyncResp>& asyncResp)
 {
     crow::connections::systemBus->async_method_call(
         [asyncResp](const boost::system::error_code ec) {
@@ -757,7 +757,7 @@
                                 const std::string& id, uint8_t prefixLength,
                                 const std::string& gateway,
                                 const std::string& address,
-                                std::shared_ptr<AsyncResp> asyncResp)
+                                const std::shared_ptr<AsyncResp>& asyncResp)
 {
     crow::connections::systemBus->async_method_call(
         [asyncResp, ifaceId, address, prefixLength,
@@ -794,7 +794,7 @@
  * @return None
  */
 inline void deleteIPv6(const std::string& ifaceId, const std::string& ipHash,
-                       const std::shared_ptr<AsyncResp> asyncResp)
+                       const std::shared_ptr<AsyncResp>& asyncResp)
 {
     crow::connections::systemBus->async_method_call(
         [asyncResp](const boost::system::error_code ec) {
@@ -823,7 +823,7 @@
 inline void deleteAndCreateIPv6(const std::string& ifaceId,
                                 const std::string& id, uint8_t prefixLength,
                                 const std::string& address,
-                                std::shared_ptr<AsyncResp> asyncResp)
+                                const std::shared_ptr<AsyncResp>& asyncResp)
 {
     crow::connections::systemBus->async_method_call(
         [asyncResp, ifaceId, address,
@@ -862,7 +862,7 @@
  */
 inline void createIPv6(const std::string& ifaceId, uint8_t prefixLength,
                        const std::string& address,
-                       std::shared_ptr<AsyncResp> asyncResp)
+                       const std::shared_ptr<AsyncResp>& asyncResp)
 {
     auto createIpHandler = [asyncResp](const boost::system::error_code ec) {
         if (ec)
@@ -1080,7 +1080,7 @@
 
   private:
     void handleHostnamePatch(const std::string& hostname,
-                             const std::shared_ptr<AsyncResp> asyncResp)
+                             const std::shared_ptr<AsyncResp>& asyncResp)
     {
         // SHOULD handle host names of up to 255 characters(RFC 1123)
         if (hostname.length() > 255)
@@ -1105,7 +1105,7 @@
 
     void handleDomainnamePatch(const std::string& ifaceId,
                                const std::string& domainname,
-                               const std::shared_ptr<AsyncResp> asyncResp)
+                               const std::shared_ptr<AsyncResp>& asyncResp)
     {
         std::vector<std::string> vectorDomainname = {domainname};
         crow::connections::systemBus->async_method_call(
@@ -1123,7 +1123,7 @@
     }
 
     void handleFqdnPatch(const std::string& ifaceId, const std::string& fqdn,
-                         const std::shared_ptr<AsyncResp> asyncResp)
+                         const std::shared_ptr<AsyncResp>& asyncResp)
     {
         // Total length of FQDN must not exceed 255 characters(RFC 1035)
         if (fqdn.length() > 255)
@@ -1203,7 +1203,7 @@
     void setDHCPEnabled(const std::string& ifaceId,
                         const std::string& propertyName, const bool v4Value,
                         const bool v6Value,
-                        const std::shared_ptr<AsyncResp> asyncResp)
+                        const std::shared_ptr<AsyncResp>& asyncResp)
     {
         const std::string dhcp = getDhcpEnabledEnumeration(v4Value, v6Value);
         crow::connections::systemBus->async_method_call(
@@ -1224,7 +1224,7 @@
 
     void setEthernetInterfaceBoolProperty(
         const std::string& ifaceId, const std::string& propertyName,
-        const bool& value, const std::shared_ptr<AsyncResp> asyncResp)
+        const bool& value, const std::shared_ptr<AsyncResp>& asyncResp)
     {
         crow::connections::systemBus->async_method_call(
             [asyncResp](const boost::system::error_code ec) {
@@ -1243,7 +1243,7 @@
     }
 
     void setDHCPv4Config(const std::string& propertyName, const bool& value,
-                         const std::shared_ptr<AsyncResp> asyncResp)
+                         const std::shared_ptr<AsyncResp>& asyncResp)
     {
         BMCWEB_LOG_DEBUG << propertyName << " = " << value;
         crow::connections::systemBus->async_method_call(
@@ -1265,7 +1265,7 @@
     void handleDHCPPatch(const std::string& ifaceId,
                          const EthernetInterfaceData& ethData,
                          DHCPParameters v4dhcpParms, DHCPParameters v6dhcpParms,
-                         const std::shared_ptr<AsyncResp> asyncResp)
+                         const std::shared_ptr<AsyncResp>& asyncResp)
     {
         bool ipv4Active = translateDHCPEnabledToBool(ethData.DHCPEnabled, true);
         bool ipv6Active =
@@ -1376,7 +1376,8 @@
     boost::container::flat_set<IPv4AddressData>::const_iterator
         getNextStaticIpEntry(
             boost::container::flat_set<IPv4AddressData>::const_iterator head,
-            boost::container::flat_set<IPv4AddressData>::const_iterator end)
+            const boost::container::flat_set<IPv4AddressData>::const_iterator&
+                end)
     {
         for (; head != end; head++)
         {
@@ -1391,7 +1392,8 @@
     boost::container::flat_set<IPv6AddressData>::const_iterator
         getNextStaticIpEntry(
             boost::container::flat_set<IPv6AddressData>::const_iterator head,
-            boost::container::flat_set<IPv6AddressData>::const_iterator end)
+            const boost::container::flat_set<IPv6AddressData>::const_iterator&
+                end)
     {
         for (; head != end; head++)
         {
@@ -1406,7 +1408,7 @@
     void handleIPv4StaticPatch(
         const std::string& ifaceId, nlohmann::json& input,
         const boost::container::flat_set<IPv4AddressData>& ipv4Data,
-        const std::shared_ptr<AsyncResp> asyncResp)
+        const std::shared_ptr<AsyncResp>& asyncResp)
     {
         if ((!input.is_array()) || input.empty())
         {
@@ -1601,7 +1603,7 @@
     void handleIPv6StaticAddressesPatch(
         const std::string& ifaceId, nlohmann::json& input,
         const boost::container::flat_set<IPv6AddressData>& ipv6Data,
-        const std::shared_ptr<AsyncResp> asyncResp)
+        const std::shared_ptr<AsyncResp>& asyncResp)
     {
         if (!input.is_array() || input.empty())
         {
@@ -1712,8 +1714,8 @@
     }
 
     void parseInterfaceData(
-        std::shared_ptr<AsyncResp> asyncResp, const std::string& iface_id,
-        const EthernetInterfaceData& ethData,
+        const std::shared_ptr<AsyncResp>& asyncResp,
+        const std::string& iface_id, const EthernetInterfaceData& ethData,
         const boost::container::flat_set<IPv4AddressData>& ipv4Data,
         const boost::container::flat_set<IPv6AddressData>& ipv6Data)
     {
diff --git a/redfish-core/lib/hypervisor_ethernet.hpp b/redfish-core/lib/hypervisor_ethernet.hpp
index 29ac725..559aa5f 100644
--- a/redfish-core/lib/hypervisor_ethernet.hpp
+++ b/redfish-core/lib/hypervisor_ethernet.hpp
@@ -8,6 +8,7 @@
 #include <utils/json_utils.hpp>
 
 #include <optional>
+#include <utility>
 #include <variant>
 
 namespace redfish
@@ -334,7 +335,7 @@
  *
  * @return None.
  */
-inline void setHypervisorIPv4Address(std::shared_ptr<AsyncResp> aResp,
+inline void setHypervisorIPv4Address(const std::shared_ptr<AsyncResp>& aResp,
                                      const std::string& ethIfaceId,
                                      const std::string& ipv4Address)
 {
@@ -365,7 +366,7 @@
  *
  * @return None.
  */
-inline void setHypervisorIPv4Subnet(std::shared_ptr<AsyncResp> aResp,
+inline void setHypervisorIPv4Subnet(const std::shared_ptr<AsyncResp>& aResp,
                                     const std::string& ethIfaceId,
                                     const uint8_t subnet)
 {
@@ -397,7 +398,7 @@
  *
  * @return None.
  */
-inline void setHypervisorIPv4Gateway(std::shared_ptr<AsyncResp> aResp,
+inline void setHypervisorIPv4Gateway(const std::shared_ptr<AsyncResp>& aResp,
                                      const std::string& gateway)
 {
     BMCWEB_LOG_DEBUG
@@ -434,7 +435,7 @@
                                  uint8_t prefixLength,
                                  const std::string& gateway,
                                  const std::string& address,
-                                 std::shared_ptr<AsyncResp> asyncResp)
+                                 const std::shared_ptr<AsyncResp>& asyncResp)
 {
     setHypervisorIPv4Address(asyncResp, ifaceId, address);
     setHypervisorIPv4Gateway(asyncResp, gateway);
@@ -450,7 +451,7 @@
  * @return None
  */
 inline void deleteHypervisorIPv4(const std::string& ifaceId,
-                                 const std::shared_ptr<AsyncResp> asyncResp)
+                                 const std::shared_ptr<AsyncResp>& asyncResp)
 {
     std::string address = "0.0.0.0";
     std::string gateway = "0.0.0.0";
@@ -522,7 +523,7 @@
 
     void handleHypervisorIPv4StaticPatch(
         const std::string& ifaceId, nlohmann::json&& input,
-        const std::shared_ptr<AsyncResp> asyncResp)
+        const std::shared_ptr<AsyncResp>& asyncResp)
     {
         if ((!input.is_array()) || input.empty())
         {
@@ -642,7 +643,7 @@
     }
 
     void handleHostnamePatch(const std::string& hostName,
-                             const std::shared_ptr<AsyncResp> asyncResp)
+                             const std::shared_ptr<AsyncResp>& asyncResp)
     {
         if (!isHostnameValid(hostName))
         {
@@ -668,7 +669,7 @@
 
     void setIPv4InterfaceEnabled(const std::string& ifaceId,
                                  const bool& isActive,
-                                 const std::shared_ptr<AsyncResp> asyncResp)
+                                 const std::shared_ptr<AsyncResp>& asyncResp)
     {
         crow::connections::systemBus->async_method_call(
             [asyncResp](const boost::system::error_code ec) {
@@ -688,7 +689,7 @@
     }
 
     void setDHCPEnabled(const std::string& ifaceId, const bool& ipv4DHCPEnabled,
-                        const std::shared_ptr<AsyncResp> asyncResp)
+                        const std::shared_ptr<AsyncResp>& asyncResp)
     {
         const std::string dhcp =
             getDhcpEnabledEnumeration(ipv4DHCPEnabled, false);
diff --git a/redfish-core/lib/led.hpp b/redfish-core/lib/led.hpp
index f9e0c47..0cb522f 100644
--- a/redfish-core/lib/led.hpp
+++ b/redfish-core/lib/led.hpp
@@ -30,7 +30,7 @@
  *
  * @return None.
  */
-inline void getIndicatorLedState(std::shared_ptr<AsyncResp> aResp)
+inline void getIndicatorLedState(const std::shared_ptr<AsyncResp>& aResp)
 {
     BMCWEB_LOG_DEBUG << "Get led groups";
     crow::connections::systemBus->async_method_call(
@@ -98,7 +98,7 @@
  *
  * @return None.
  */
-inline void setIndicatorLedState(std::shared_ptr<AsyncResp> aResp,
+inline void setIndicatorLedState(const std::shared_ptr<AsyncResp>& aResp,
                                  const std::string& ledState)
 {
     BMCWEB_LOG_DEBUG << "Set led groups";
diff --git a/redfish-core/lib/log_services.hpp b/redfish-core/lib/log_services.hpp
index bbf8768..c5b7b9d 100644
--- a/redfish-core/lib/log_services.hpp
+++ b/redfish-core/lib/log_services.hpp
@@ -683,7 +683,7 @@
 }
 
 inline void createDumpTaskCallback(const crow::Request& req,
-                                   std::shared_ptr<AsyncResp> asyncResp,
+                                   const std::shared_ptr<AsyncResp>& asyncResp,
                                    const uint32_t& dumpId,
                                    const std::string& dumpPath,
                                    const std::string& dumpType)
@@ -1067,7 +1067,7 @@
 };
 
 static int fillEventLogEntryJson(const std::string& logEntryID,
-                                 const std::string logEntry,
+                                 const std::string& logEntry,
                                  nlohmann::json& logEntryJson)
 {
     // The redfish log format is "<Timestamp> <MessageId>,<MessageArgs>"
@@ -2418,7 +2418,7 @@
     }
 };
 
-static void logCrashdumpEntry(std::shared_ptr<AsyncResp> asyncResp,
+static void logCrashdumpEntry(const std::shared_ptr<AsyncResp>& asyncResp,
                               const std::string& logID,
                               nlohmann::json& logEntryJson)
 {
@@ -3052,7 +3052,7 @@
 };
 
 static void fillPostCodeEntry(
-    std::shared_ptr<AsyncResp> aResp,
+    const std::shared_ptr<AsyncResp>& aResp,
     const boost::container::flat_map<uint64_t, uint64_t>& postcode,
     const uint16_t bootIndex, const uint64_t codeIndex = 0,
     const uint64_t skip = 0, const uint64_t top = 0)
@@ -3170,7 +3170,7 @@
     }
 }
 
-static void getPostCodeForEntry(std::shared_ptr<AsyncResp> aResp,
+static void getPostCodeForEntry(const std::shared_ptr<AsyncResp>& aResp,
                                 const uint16_t bootIndex,
                                 const uint64_t codeIndex)
 {
@@ -3202,7 +3202,7 @@
         bootIndex);
 }
 
-static void getPostCodeForBoot(std::shared_ptr<AsyncResp> aResp,
+static void getPostCodeForBoot(const std::shared_ptr<AsyncResp>& aResp,
                                const uint16_t bootIndex,
                                const uint16_t bootCount,
                                const uint64_t entryCount, const uint64_t skip,
@@ -3257,7 +3257,7 @@
         bootIndex);
 }
 
-static void getCurrentBootNumber(std::shared_ptr<AsyncResp> aResp,
+static void getCurrentBootNumber(const std::shared_ptr<AsyncResp>& aResp,
                                  const uint64_t skip, const uint64_t top)
 {
     uint64_t entryCount = 0;
diff --git a/redfish-core/lib/managers.hpp b/redfish-core/lib/managers.hpp
index 2da7f3a..3992c94 100644
--- a/redfish-core/lib/managers.hpp
+++ b/redfish-core/lib/managers.hpp
@@ -38,7 +38,7 @@
  *
  * @param[in] asyncResp - Shared pointer for completing asynchronous calls
  */
-inline void doBMCGracefulRestart(std::shared_ptr<AsyncResp> asyncResp)
+inline void doBMCGracefulRestart(const std::shared_ptr<AsyncResp>& asyncResp)
 {
     const char* processName = "xyz.openbmc_project.State.BMC";
     const char* objectPath = "/xyz/openbmc_project/state/bmc0";
@@ -66,7 +66,7 @@
         interfaceName, destProperty, dbusPropertyValue);
 }
 
-inline void doBMCForceRestart(std::shared_ptr<AsyncResp> asyncResp)
+inline void doBMCForceRestart(const std::shared_ptr<AsyncResp>& asyncResp)
 {
     const char* processName = "xyz.openbmc_project.State.BMC";
     const char* objectPath = "/xyz/openbmc_project/state/bmc0";
@@ -278,7 +278,7 @@
                              const std::string& path,
                              const std::string& currentProfile,
                              const std::vector<std::string>& supportedProfiles,
-                             std::shared_ptr<AsyncResp> asyncResp)
+                             const std::shared_ptr<AsyncResp>& asyncResp)
 {
 
     crow::connections::systemBus->async_method_call(
@@ -763,7 +763,7 @@
 
 inline CreatePIDRet createPidInterface(
     const std::shared_ptr<AsyncResp>& response, const std::string& type,
-    nlohmann::json::iterator it, const std::string& path,
+    const nlohmann::json::iterator& it, const std::string& path,
     const dbus::utility::ManagedObjectType& managedObj, bool createNewObject,
     boost::container::flat_map<std::string, dbus::utility::DbusVariantType>&
         output,
@@ -1799,7 +1799,7 @@
         pids->run();
 
         getMainChassisId(asyncResp, [](const std::string& chassisId,
-                                       const std::shared_ptr<AsyncResp> aRsp) {
+                                       const std::shared_ptr<AsyncResp>& aRsp) {
             aRsp->res.jsonValue["Links"]["ManagerForChassis@odata.count"] = 1;
             aRsp->res.jsonValue["Links"]["ManagerForChassis"] = {
                 {{"@odata.id", "/redfish/v1/Chassis/" + chassisId}}};
@@ -1910,7 +1910,7 @@
         }
     }
 
-    void getLastResetTime(std::shared_ptr<AsyncResp> aResp)
+    void getLastResetTime(const std::shared_ptr<AsyncResp>& aResp)
     {
         BMCWEB_LOG_DEBUG << "Getting Manager Last Reset Time";
 
@@ -1953,7 +1953,7 @@
      *
      * @return void
      */
-    void setActiveFirmwareImage(std::shared_ptr<AsyncResp> aResp,
+    void setActiveFirmwareImage(const std::shared_ptr<AsyncResp>& aResp,
                                 const std::string&& runningFirmwareTarget)
     {
         // Get the Id from /redfish/v1/UpdateService/FirmwareInventory/<Id>
diff --git a/redfish-core/lib/pcie.hpp b/redfish-core/lib/pcie.hpp
index 19438af..0a8aa98 100644
--- a/redfish-core/lib/pcie.hpp
+++ b/redfish-core/lib/pcie.hpp
@@ -28,8 +28,9 @@
 static constexpr char const* pcieDeviceInterface =
     "xyz.openbmc_project.PCIe.Device";
 
-static inline void getPCIeDeviceList(std::shared_ptr<AsyncResp> asyncResp,
-                                     const std::string& name)
+static inline void
+    getPCIeDeviceList(const std::shared_ptr<AsyncResp>& asyncResp,
+                      const std::string& name)
 {
     auto getPCIeMapCallback = [asyncResp, name](
                                   const boost::system::error_code ec,
diff --git a/redfish-core/lib/power.hpp b/redfish-core/lib/power.hpp
index 5096a2f..5051696 100644
--- a/redfish-core/lib/power.hpp
+++ b/redfish-core/lib/power.hpp
@@ -39,7 +39,7 @@
 
   private:
     void setPowerCapOverride(
-        std::shared_ptr<SensorsAsyncResp> asyncResp,
+        const std::shared_ptr<SensorsAsyncResp>& asyncResp,
         std::vector<nlohmann::json>& powerControlCollections)
     {
         auto getChassisPath =
diff --git a/redfish-core/lib/sensors.hpp b/redfish-core/lib/sensors.hpp
index 91e54bb..6480861 100644
--- a/redfish-core/lib/sensors.hpp
+++ b/redfish-core/lib/sensors.hpp
@@ -25,6 +25,7 @@
 #include <utils/json_utils.hpp>
 
 #include <cmath>
+#include <utility>
 #include <variant>
 
 namespace redfish
@@ -89,7 +90,7 @@
     };
 
     SensorsAsyncResp(crow::Response& response, const std::string& chassisIdIn,
-                     const std::vector<const char*> typesIn,
+                     const std::vector<const char*>& typesIn,
                      const std::string_view& subNode) :
         res(response),
         chassisId(chassisIdIn), types(typesIn), chassisSubNode(subNode)
@@ -97,7 +98,7 @@
 
     // Store extra data about sensor mapping and return it in callback
     SensorsAsyncResp(crow::Response& response, const std::string& chassisIdIn,
-                     const std::vector<const char*> typesIn,
+                     const std::vector<const char*>& typesIn,
                      const std::string_view& subNode,
                      DataCompleteCb&& creationComplete) :
         res(response),
@@ -222,8 +223,8 @@
  */
 template <typename Callback>
 void getObjectsWithConnection(
-    std::shared_ptr<SensorsAsyncResp> SensorsAsyncResp,
-    const std::shared_ptr<boost::container::flat_set<std::string>> sensorNames,
+    const std::shared_ptr<SensorsAsyncResp>& SensorsAsyncResp,
+    const std::shared_ptr<boost::container::flat_set<std::string>>& sensorNames,
     Callback&& callback)
 {
     BMCWEB_LOG_DEBUG << "getObjectsWithConnection enter";
@@ -319,9 +320,10 @@
  * made, and eliminate Power sensors when a Thermal request is made.
  */
 inline void reduceSensorList(
-    std::shared_ptr<SensorsAsyncResp> SensorsAsyncResp,
+    const std::shared_ptr<SensorsAsyncResp>& SensorsAsyncResp,
     const std::vector<std::string>* allSensors,
-    std::shared_ptr<boost::container::flat_set<std::string>> activeSensors)
+    const std::shared_ptr<boost::container::flat_set<std::string>>&
+        activeSensors)
 {
     if (SensorsAsyncResp == nullptr)
     {
@@ -361,7 +363,7 @@
  * @param callback  Callback for next step to get valid chassis path
  */
 template <typename Callback>
-void getValidChassisPath(std::shared_ptr<SensorsAsyncResp> asyncResp,
+void getValidChassisPath(const std::shared_ptr<SensorsAsyncResp>& asyncResp,
                          Callback&& callback)
 {
     BMCWEB_LOG_DEBUG << "checkChassisId enter";
@@ -417,7 +419,7 @@
  * @param callback  Callback for next step in gathered sensor processing
  */
 template <typename Callback>
-void getChassis(std::shared_ptr<SensorsAsyncResp> sensorsAsyncResp,
+void getChassis(const std::shared_ptr<SensorsAsyncResp>& sensorsAsyncResp,
                 Callback&& callback)
 {
     BMCWEB_LOG_DEBUG << "getChassis enter";
@@ -563,8 +565,9 @@
  * @param callback Callback to invoke when object paths obtained.
  */
 template <typename Callback>
-void getObjectManagerPaths(std::shared_ptr<SensorsAsyncResp> SensorsAsyncResp,
-                           Callback&& callback)
+void getObjectManagerPaths(
+    const std::shared_ptr<SensorsAsyncResp>& SensorsAsyncResp,
+    Callback&& callback)
 {
     BMCWEB_LOG_DEBUG << "getObjectManagerPaths enter";
     const std::array<std::string, 1> interfaces = {
@@ -793,7 +796,7 @@
  */
 inline void objectInterfacesToJson(
     const std::string& sensorName, const std::string& sensorType,
-    std::shared_ptr<SensorsAsyncResp> sensorsAsyncResp,
+    const std::shared_ptr<SensorsAsyncResp>& sensorsAsyncResp,
     const boost::container::flat_map<
         std::string, boost::container::flat_map<std::string, SensorVariant>>&
         interfacesDict,
@@ -1041,8 +1044,8 @@
     BMCWEB_LOG_DEBUG << "Added sensor " << sensorName;
 }
 
-inline void
-    populateFanRedundancy(std::shared_ptr<SensorsAsyncResp> sensorsAsyncResp)
+inline void populateFanRedundancy(
+    const std::shared_ptr<SensorsAsyncResp>& sensorsAsyncResp)
 {
     crow::connections::systemBus->async_method_call(
         [sensorsAsyncResp](const boost::system::error_code ec,
@@ -1248,7 +1251,8 @@
             "xyz.openbmc_project.Control.FanRedundancy"});
 }
 
-inline void sortJSONResponse(std::shared_ptr<SensorsAsyncResp> SensorsAsyncResp)
+inline void
+    sortJSONResponse(const std::shared_ptr<SensorsAsyncResp>& SensorsAsyncResp)
 {
     nlohmann::json& response = SensorsAsyncResp->res.jsonValue;
     std::array<std::string, 2> sensorHeaders{"Temperatures", "Fans"};
@@ -1294,7 +1298,7 @@
  * @return Inventory item within vector, or nullptr if no match found.
  */
 inline InventoryItem* findInventoryItem(
-    std::shared_ptr<std::vector<InventoryItem>> inventoryItems,
+    const std::shared_ptr<std::vector<InventoryItem>>& inventoryItems,
     const std::string& invItemObjPath)
 {
     for (InventoryItem& inventoryItem : *inventoryItems)
@@ -1314,7 +1318,7 @@
  * @return Inventory item within vector, or nullptr if no match found.
  */
 inline InventoryItem* findInventoryItemForSensor(
-    std::shared_ptr<std::vector<InventoryItem>> inventoryItems,
+    const std::shared_ptr<std::vector<InventoryItem>>& inventoryItems,
     const std::string& sensorObjPath)
 {
     for (InventoryItem& inventoryItem : *inventoryItems)
@@ -1361,10 +1365,9 @@
  * @param invItemObjPath D-Bus object path of inventory item.
  * @param sensorObjPath D-Bus object path of sensor
  */
-inline void
-    addInventoryItem(std::shared_ptr<std::vector<InventoryItem>> inventoryItems,
-                     const std::string& invItemObjPath,
-                     const std::string& sensorObjPath)
+inline void addInventoryItem(
+    const std::shared_ptr<std::vector<InventoryItem>>& inventoryItems,
+    const std::string& invItemObjPath, const std::string& sensorObjPath)
 {
     // Look for inventory item in vector
     InventoryItem* inventoryItem =
@@ -1624,8 +1627,8 @@
  */
 template <typename Callback>
 static void getInventoryItemsConnections(
-    std::shared_ptr<SensorsAsyncResp> sensorsAsyncResp,
-    std::shared_ptr<std::vector<InventoryItem>> inventoryItems,
+    const std::shared_ptr<SensorsAsyncResp>& sensorsAsyncResp,
+    const std::shared_ptr<std::vector<InventoryItem>>& inventoryItems,
     Callback&& callback)
 {
     BMCWEB_LOG_DEBUG << "getInventoryItemsConnections enter";
@@ -1711,9 +1714,9 @@
  */
 template <typename Callback>
 static void getInventoryItemAssociations(
-    std::shared_ptr<SensorsAsyncResp> sensorsAsyncResp,
-    const std::shared_ptr<boost::container::flat_set<std::string>> sensorNames,
-    std::shared_ptr<boost::container::flat_map<std::string, std::string>>
+    const std::shared_ptr<SensorsAsyncResp>& sensorsAsyncResp,
+    const std::shared_ptr<boost::container::flat_set<std::string>>& sensorNames,
+    const std::shared_ptr<boost::container::flat_map<std::string, std::string>>&
         objectMgrPaths,
     Callback&& callback)
 {
@@ -2074,7 +2077,7 @@
  */
 template <typename Callback>
 void getPowerSupplyAttributesData(
-    std::shared_ptr<SensorsAsyncResp> sensorsAsyncResp,
+    const std::shared_ptr<SensorsAsyncResp>& sensorsAsyncResp,
     std::shared_ptr<std::vector<InventoryItem>> inventoryItems,
     const boost::container::flat_map<std::string, std::string>&
         psAttributesConnections,
@@ -2415,12 +2418,12 @@
  * @param inventoryItems Inventory items associated with the sensors.
  */
 inline void getSensorData(
-    std::shared_ptr<SensorsAsyncResp> SensorsAsyncResp,
-    const std::shared_ptr<boost::container::flat_set<std::string>> sensorNames,
+    const std::shared_ptr<SensorsAsyncResp>& SensorsAsyncResp,
+    const std::shared_ptr<boost::container::flat_set<std::string>>& sensorNames,
     const boost::container::flat_set<std::string>& connections,
-    std::shared_ptr<boost::container::flat_map<std::string, std::string>>
+    const std::shared_ptr<boost::container::flat_map<std::string, std::string>>&
         objectMgrPaths,
-    std::shared_ptr<std::vector<InventoryItem>> inventoryItems)
+    const std::shared_ptr<std::vector<InventoryItem>>& inventoryItems)
 {
     BMCWEB_LOG_DEBUG << "getSensorData enter";
     // Get managed objects from all services exposing sensors
@@ -2599,18 +2602,17 @@
 }
 
 inline void processSensorList(
-    std::shared_ptr<SensorsAsyncResp> SensorsAsyncResp,
-    std::shared_ptr<boost::container::flat_set<std::string>> sensorNames)
+    const std::shared_ptr<SensorsAsyncResp>& SensorsAsyncResp,
+    const std::shared_ptr<boost::container::flat_set<std::string>>& sensorNames)
 {
     auto getConnectionCb =
         [SensorsAsyncResp, sensorNames](
             const boost::container::flat_set<std::string>& connections) {
             BMCWEB_LOG_DEBUG << "getConnectionCb enter";
             auto getObjectManagerPathsCb =
-                [SensorsAsyncResp, sensorNames, connections](
-                    std::shared_ptr<
-                        boost::container::flat_map<std::string, std::string>>
-                        objectMgrPaths) {
+                [SensorsAsyncResp, sensorNames,
+                 connections](const std::shared_ptr<boost::container::flat_map<
+                                  std::string, std::string>>& objectMgrPaths) {
                     BMCWEB_LOG_DEBUG << "getObjectManagerPathsCb enter";
                     auto getInventoryItemsCb =
                         [SensorsAsyncResp, sensorNames, connections,
@@ -2621,7 +2623,7 @@
                             // Get sensor data and store results in JSON
                             getSensorData(SensorsAsyncResp, sensorNames,
                                           connections, objectMgrPaths,
-                                          inventoryItems);
+                                          std::move(inventoryItems));
                             BMCWEB_LOG_DEBUG << "getInventoryItemsCb exit";
                         };
 
@@ -2649,7 +2651,8 @@
  *        chassis.
  * @param SensorsAsyncResp   Pointer to object holding response data
  */
-inline void getChassisData(std::shared_ptr<SensorsAsyncResp> SensorsAsyncResp)
+inline void
+    getChassisData(const std::shared_ptr<SensorsAsyncResp>& SensorsAsyncResp)
 {
     BMCWEB_LOG_DEBUG << "getChassisData enter";
     auto getChassisCb =
@@ -2657,7 +2660,7 @@
             std::shared_ptr<boost::container::flat_set<std::string>>
                 sensorNames) {
             BMCWEB_LOG_DEBUG << "getChassisCb enter";
-            processSensorList(SensorsAsyncResp, sensorNames);
+            processSensorList(SensorsAsyncResp, std::move(sensorNames));
             BMCWEB_LOG_DEBUG << "getChassisCb exit";
         };
     SensorsAsyncResp->res.jsonValue["Redundancy"] = nlohmann::json::array();
@@ -2706,7 +2709,7 @@
  * @param chassisSubNode   Chassis Node for which the query has to happen
  */
 inline void setSensorsOverride(
-    std::shared_ptr<SensorsAsyncResp> sensorAsyncResp,
+    const std::shared_ptr<SensorsAsyncResp>& sensorAsyncResp,
     std::unordered_map<std::string, std::vector<nlohmann::json>>&
         allCollections)
 {
@@ -2743,11 +2746,10 @@
         }
     }
 
-    auto getChassisSensorListCb = [sensorAsyncResp,
-                                   overrideMap](const std::shared_ptr<
-                                                boost::container::flat_set<
-                                                    std::string>>
-                                                    sensorsList) {
+    auto getChassisSensorListCb = [sensorAsyncResp, overrideMap](
+                                      const std::shared_ptr<
+                                          boost::container::flat_set<
+                                              std::string>>& sensorsList) {
         // Match sensor names in the PATCH request to those managed by the
         // chassis node
         const std::shared_ptr<boost::container::flat_set<std::string>>
@@ -2859,7 +2861,7 @@
  * @param chassisSubNode   Chassis Node for which the query has to happen
  */
 inline void checkAndDoSensorsOverride(
-    std::shared_ptr<SensorsAsyncResp> sensorAsyncResp,
+    const std::shared_ptr<SensorsAsyncResp>& sensorAsyncResp,
     std::unordered_map<std::string, std::vector<nlohmann::json>>&
         allCollections)
 {
@@ -3029,8 +3031,9 @@
                 sensors::node::sensors);
 
         auto getChassisCb =
-            [asyncResp](std::shared_ptr<boost::container::flat_set<std::string>>
-                            sensorNames) {
+            [asyncResp](
+                const std::shared_ptr<boost::container::flat_set<std::string>>&
+                    sensorNames) {
                 BMCWEB_LOG_DEBUG << "getChassisCb enter";
 
                 nlohmann::json& entriesArray =
diff --git a/redfish-core/lib/storage.hpp b/redfish-core/lib/storage.hpp
index ccd8ab8..e89db65 100644
--- a/redfish-core/lib/storage.hpp
+++ b/redfish-core/lib/storage.hpp
@@ -346,7 +346,7 @@
 
                 getMainChassisId(
                     asyncResp, [](const std::string& chassisId,
-                                  std::shared_ptr<AsyncResp> aRsp) {
+                                  const std::shared_ptr<AsyncResp>& aRsp) {
                         aRsp->res.jsonValue["Links"]["Chassis"] = {
                             {"@odata.id", "/redfish/v1/Chassis/" + chassisId}};
                     });
diff --git a/redfish-core/lib/systems.hpp b/redfish-core/lib/systems.hpp
index 3f74ca5..9f304b0 100644
--- a/redfish-core/lib/systems.hpp
+++ b/redfish-core/lib/systems.hpp
@@ -38,7 +38,7 @@
  *
  * @return None.
  */
-inline void updateDimmProperties(std::shared_ptr<AsyncResp> aResp,
+inline void updateDimmProperties(const std::shared_ptr<AsyncResp>& aResp,
                                  const std::variant<bool>& dimmState)
 {
     const bool* isDimmFunctional = std::get_if<bool>(&dimmState);
@@ -72,7 +72,7 @@
  *
  * @return None.
  */
-inline void modifyCpuPresenceState(std::shared_ptr<AsyncResp> aResp,
+inline void modifyCpuPresenceState(const std::shared_ptr<AsyncResp>& aResp,
                                    const std::variant<bool>& cpuPresenceState)
 {
     const bool* isCpuPresent = std::get_if<bool>(&cpuPresenceState);
@@ -108,7 +108,7 @@
  * @return None.
  */
 inline void
-    modifyCpuFunctionalState(std::shared_ptr<AsyncResp> aResp,
+    modifyCpuFunctionalState(const std::shared_ptr<AsyncResp>& aResp,
                              const std::variant<bool>& cpuFunctionalState)
 {
     const bool* isCpuFunctional = std::get_if<bool>(&cpuFunctionalState);
@@ -144,8 +144,9 @@
  *
  * @return None.
  */
-inline void getComputerSystem(std::shared_ptr<AsyncResp> aResp,
-                              std::shared_ptr<HealthPopulate> systemHealth)
+inline void
+    getComputerSystem(const std::shared_ptr<AsyncResp>& aResp,
+                      const std::shared_ptr<HealthPopulate>& systemHealth)
 {
     BMCWEB_LOG_DEBUG << "Get available system components.";
 
@@ -613,7 +614,7 @@
  *
  * @return None.
  */
-inline void getHostState(std::shared_ptr<AsyncResp> aResp)
+inline void getHostState(const std::shared_ptr<AsyncResp>& aResp)
 {
     BMCWEB_LOG_DEBUG << "Get host information.";
     crow::connections::systemBus->async_method_call(
@@ -729,7 +730,7 @@
  *
  * @return Integer error code.
  */
-inline int assignBootParameters(std::shared_ptr<AsyncResp> aResp,
+inline int assignBootParameters(const std::shared_ptr<AsyncResp>& aResp,
                                 const std::string& rfSource,
                                 std::string& bootSource, std::string& bootMode)
 {
@@ -789,8 +790,8 @@
  *
  * @return None.
  */
-inline void getBootMode(std::shared_ptr<AsyncResp> aResp,
-                        std::string bootDbusObj)
+inline void getBootMode(const std::shared_ptr<AsyncResp>& aResp,
+                        const std::string& bootDbusObj)
 {
     crow::connections::systemBus->async_method_call(
         [aResp](const boost::system::error_code ec,
@@ -904,7 +905,7 @@
  *
  * @return None.
  */
-inline void getBootProperties(std::shared_ptr<AsyncResp> aResp)
+inline void getBootProperties(const std::shared_ptr<AsyncResp>& aResp)
 {
     BMCWEB_LOG_DEBUG << "Get boot information.";
 
@@ -945,7 +946,7 @@
  *
  * @return None.
  */
-inline void getLastResetTime(std::shared_ptr<AsyncResp> aResp)
+inline void getLastResetTime(const std::shared_ptr<AsyncResp>& aResp)
 {
     BMCWEB_LOG_DEBUG << "Getting System Last Reset Time";
 
@@ -988,7 +989,7 @@
  *
  * @return None.
  */
-inline void getAutomaticRetry(std::shared_ptr<AsyncResp> aResp)
+inline void getAutomaticRetry(const std::shared_ptr<AsyncResp>& aResp)
 {
     BMCWEB_LOG_DEBUG << "Get Automatic Retry policy";
 
@@ -1079,7 +1080,7 @@
  *
  * @return None.
  */
-inline void getPowerRestorePolicy(std::shared_ptr<AsyncResp> aResp)
+inline void getPowerRestorePolicy(const std::shared_ptr<AsyncResp>& aResp)
 {
     BMCWEB_LOG_DEBUG << "Get power restore policy";
 
@@ -1259,7 +1260,7 @@
  *
  * @return Integer error code.
  */
-inline void setBootSourceProperties(std::shared_ptr<AsyncResp> aResp,
+inline void setBootSourceProperties(const std::shared_ptr<AsyncResp>& aResp,
                                     std::optional<std::string> bootSource,
                                     std::optional<std::string> bootEnable)
 {
@@ -1303,7 +1304,7 @@
  *
  * @return None.
  */
-inline void setAutomaticRetry(std::shared_ptr<AsyncResp> aResp,
+inline void setAutomaticRetry(const std::shared_ptr<AsyncResp>& aResp,
                               const std::string&& automaticRetryConfig)
 {
     BMCWEB_LOG_DEBUG << "Set Automatic Retry.";
@@ -1352,7 +1353,7 @@
  *
  * @return None.
  */
-inline void setPowerRestorePolicy(std::shared_ptr<AsyncResp> aResp,
+inline void setPowerRestorePolicy(const std::shared_ptr<AsyncResp>& aResp,
                                   std::optional<std::string> policy)
 {
     BMCWEB_LOG_DEBUG << "Set power restore policy.";
@@ -1532,7 +1533,7 @@
  *
  * @return None.
  */
-inline void getHostWatchdogTimer(std::shared_ptr<AsyncResp> aResp)
+inline void getHostWatchdogTimer(const std::shared_ptr<AsyncResp>& aResp)
 {
     BMCWEB_LOG_DEBUG << "Get host watchodg";
     crow::connections::systemBus->async_method_call(
@@ -1603,7 +1604,7 @@
  *
  * @return None.
  */
-inline void setWDTProperties(std::shared_ptr<AsyncResp> aResp,
+inline void setWDTProperties(const std::shared_ptr<AsyncResp>& aResp,
                              const std::optional<bool> wdtEnable,
                              const std::optional<std::string>& wdtTimeOutAction)
 {
@@ -1959,7 +1960,7 @@
         health->populate();
 
         getMainChassisId(asyncResp, [](const std::string& chassisId,
-                                       std::shared_ptr<AsyncResp> aRsp) {
+                                       const std::shared_ptr<AsyncResp>& aRsp) {
             aRsp->res.jsonValue["Links"]["Chassis"] = {
                 {{"@odata.id", "/redfish/v1/Chassis/" + chassisId}}};
         });
diff --git a/redfish-core/lib/update_service.hpp b/redfish-core/lib/update_service.hpp
index e3e6bbb..7e6a0b8 100644
--- a/redfish-core/lib/update_service.hpp
+++ b/redfish-core/lib/update_service.hpp
@@ -60,7 +60,7 @@
 
 // Note that asyncResp can be either a valid pointer or nullptr. If nullptr
 // then no asyncResp updates will occur
-static void softwareInterfaceAdded(std::shared_ptr<AsyncResp> asyncResp,
+static void softwareInterfaceAdded(const std::shared_ptr<AsyncResp>& asyncResp,
                                    sdbusplus::message::message& m,
                                    const crow::Request& req)
 {
@@ -256,10 +256,9 @@
 
 // Note that asyncResp can be either a valid pointer or nullptr. If nullptr
 // then no asyncResp updates will occur
-static void monitorForSoftwareAvailable(std::shared_ptr<AsyncResp> asyncResp,
-                                        const crow::Request& req,
-                                        const std::string& url,
-                                        int timeoutTimeSeconds = 10)
+static void monitorForSoftwareAvailable(
+    const std::shared_ptr<AsyncResp>& asyncResp, const crow::Request& req,
+    const std::string& url, int timeoutTimeSeconds = 10)
 {
     // Only allow one FW update at a time
     if (fwUpdateInProgress != false)
@@ -775,7 +774,7 @@
 
   private:
     /* Fill related item links (i.e. bmc, bios) in for inventory */
-    static void getRelatedItems(std::shared_ptr<AsyncResp> aResp,
+    static void getRelatedItems(const std::shared_ptr<AsyncResp>& aResp,
                                 const std::string& purpose)
     {
         if (purpose == fw_util::bmcPurpose)
diff --git a/redfish-core/ut/lock_test.cpp b/redfish-core/ut/lock_test.cpp
index 5c68cdc..ae639ea 100644
--- a/redfish-core/ut/lock_test.cpp
+++ b/redfish-core/ut/lock_test.cpp
@@ -66,17 +66,17 @@
 class MockLock : public crow::ibm_mc_lock::Lock
 {
   public:
-    bool isValidLockRequest(LockRequest record1) override
+    bool isValidLockRequest(const LockRequest& record1) override
     {
         bool status = Lock::isValidLockRequest(record1);
         return status;
     }
-    bool isConflictRequest(LockRequests request) override
+    bool isConflictRequest(const LockRequests& request) override
     {
         bool status = Lock::isConflictRequest(request);
         return status;
     }
-    Rc isConflictWithTable(LockRequests request) override
+    Rc isConflictWithTable(const LockRequests& request) override
     {
         auto conflict = Lock::isConflictWithTable(request);
         return conflict;
