diff --git a/http/app.h b/http/app.h
index 86cebd3..39829cb 100644
--- a/http/app.h
+++ b/http/app.h
@@ -80,7 +80,7 @@
 
     App& bindaddr(std::string bindaddr)
     {
-        bindaddrStr = bindaddr;
+        bindaddrStr = std::move(bindaddr);
         return *this;
     }
 
diff --git a/http/http_server.h b/http/http_server.h
index c26e9e0..0ca7dea 100644
--- a/http/http_server.h
+++ b/http/http_server.h
@@ -37,12 +37,12 @@
         ioService(std::move(io)),
         acceptor(std::move(acceptorIn)),
         signals(*ioService, SIGINT, SIGTERM, SIGHUP), timer(*ioService),
-        handler(handlerIn), adaptorCtx(adaptor_ctx)
+        handler(handlerIn), adaptorCtx(std::move(adaptor_ctx))
     {}
 
     Server(Handler* handlerIn, const std::string& bindaddr, uint16_t port,
-           std::shared_ptr<boost::asio::ssl::context> adaptor_ctx,
-           std::shared_ptr<boost::asio::io_context> io =
+           const std::shared_ptr<boost::asio::ssl::context>& adaptor_ctx,
+           const std::shared_ptr<boost::asio::io_context>& io =
                std::make_shared<boost::asio::io_context>()) :
         Server(handlerIn,
                std::make_unique<boost::asio::ip::tcp::acceptor>(
@@ -52,8 +52,8 @@
     {}
 
     Server(Handler* handlerIn, int existing_socket,
-           std::shared_ptr<boost::asio::ssl::context> adaptor_ctx,
-           std::shared_ptr<boost::asio::io_context> io =
+           const std::shared_ptr<boost::asio::ssl::context>& adaptor_ctx,
+           const std::shared_ptr<boost::asio::io_context>& io =
                std::make_shared<boost::asio::io_context>()) :
         Server(handlerIn,
                std::make_unique<boost::asio::ip::tcp::acceptor>(
diff --git a/http/routing.h b/http/routing.h
index 52d1b06..59fa636 100644
--- a/http/routing.h
+++ b/http/routing.h
@@ -403,7 +403,7 @@
         return *p;
     }
 
-    self_t& name(std::string name) noexcept
+    self_t& name(const std::string& name) noexcept
     {
         self_t* self = static_cast<self_t*>(this);
         self->nameStr = std::move(name);
@@ -522,7 +522,7 @@
   public:
     using self_t = TaggedRule<Args...>;
 
-    TaggedRule(std::string ruleIn) : BaseRule(std::move(ruleIn))
+    TaggedRule(const std::string& ruleIn) : BaseRule(std::move(ruleIn))
     {}
 
     void validate() override
@@ -613,7 +613,7 @@
     }
 
     template <typename Func>
-    void operator()(std::string name, Func&& f)
+    void operator()(const std::string& name, Func&& f)
     {
         nameStr = std::move(name);
         (*this).template operator()<Func>(std::forward(f));
diff --git a/include/authorization.hpp b/include/authorization.hpp
index 634620b..997e504 100644
--- a/include/authorization.hpp
+++ b/include/authorization.hpp
@@ -13,6 +13,7 @@
 #include <pam_authenticate.hpp>
 
 #include <random>
+#include <utility>
 
 namespace crow
 {
@@ -165,7 +166,7 @@
 #ifdef BMCWEB_ENABLE_MUTUAL_TLS_AUTHENTICATION
 static std::shared_ptr<persistent_data::UserSession>
     performTLSAuth(const crow::Request& req, Response& res,
-                   std::weak_ptr<persistent_data::UserSession> session)
+                   const std::weak_ptr<persistent_data::UserSession>& session)
 {
     if (auto sp = session.lock())
     {
@@ -244,7 +245,7 @@
 #ifdef BMCWEB_ENABLE_MUTUAL_TLS_AUTHENTICATION
     if (req.session == nullptr && authMethodsConfig.tls)
     {
-        req.session = performTLSAuth(req, res, session);
+        req.session = performTLSAuth(req, res, std::move(session));
     }
 #endif
     if (req.session == nullptr && authMethodsConfig.xtoken)
diff --git a/include/dbus_monitor.hpp b/include/dbus_monitor.hpp
index f770ec3..089df76 100644
--- a/include/dbus_monitor.hpp
+++ b/include/dbus_monitor.hpp
@@ -108,7 +108,7 @@
         .privileges({"Login"})
         .websocket()
         .onopen([&](crow::websocket::Connection& conn,
-                    std::shared_ptr<bmcweb::AsyncResp>) {
+                    const std::shared_ptr<bmcweb::AsyncResp>&) {
             BMCWEB_LOG_DEBUG << "Connection " << &conn << " opened";
             sessions[&conn] = DbusWebsocketSession();
         })
diff --git a/include/ibm/locks.hpp b/include/ibm/locks.hpp
index b897fa7..201085f 100644
--- a/include/ibm/locks.hpp
+++ b/include/ibm/locks.hpp
@@ -15,7 +15,6 @@
 namespace ibm_mc_lock
 {
 
-namespace fs = std::filesystem;
 using SType = std::string;
 
 /*----------------------------------------
@@ -68,7 +67,7 @@
      * Returns : False (if not a Valid lock request)
      */
 
-    virtual bool isValidLockRequest(const LockRequest);
+    virtual bool isValidLockRequest(const LockRequest&);
 
     /*
      * This function implements the logic of checking if the incoming
@@ -78,7 +77,7 @@
      * Returns : False (if not conflicting)
      */
 
-    virtual bool isConflictRequest(const LockRequests);
+    virtual bool isConflictRequest(const LockRequests&);
     /*
      * Implements the core algorithm to find the conflicting
      * lock requests.
@@ -89,7 +88,7 @@
      * Returns : True (if conflicting)
      * Returns : False (if not conflicting)
      */
-    virtual bool isConflictRecord(const LockRequest, const LockRequest);
+    virtual bool isConflictRecord(const LockRequest&, const LockRequest&);
 
     /*
      * This function implements the logic of checking the conflicting
@@ -98,7 +97,7 @@
      *
      */
 
-    virtual Rc isConflictWithTable(const LockRequests);
+    virtual Rc isConflictWithTable(const LockRequests&);
     /*
      * This function implements the logic of checking the ownership of the
      * lock from the releaselock request.
@@ -153,7 +152,7 @@
      *
      */
 
-    RcAcquireLock acquireLock(const LockRequests);
+    RcAcquireLock acquireLock(const LockRequests&);
 
     /*
      * This function implements the logic for releasing the lock that are
@@ -260,9 +259,10 @@
     }
     std::ofstream persistentFile(fileName);
     // set the permission of the file to 640
-    fs::perms permission =
-        fs::perms::owner_read | fs::perms::owner_write | fs::perms::group_read;
-    fs::permissions(fileName, permission);
+    std::filesystem::perms permission = std::filesystem::perms::owner_read |
+                                        std::filesystem::perms::owner_write |
+                                        std::filesystem::perms::group_read;
+    std::filesystem::permissions(fileName, permission);
     nlohmann::json data;
     for (const auto& it : lockTable)
     {
@@ -329,7 +329,7 @@
     return std::make_pair(true, status);
 }
 
-inline RcAcquireLock Lock::acquireLock(const LockRequests lockRequestStructure)
+inline RcAcquireLock Lock::acquireLock(const LockRequests& lockRequestStructure)
 {
 
     // validate the lock request
@@ -466,7 +466,7 @@
     return true;
 }
 
-inline bool Lock::isValidLockRequest(const LockRequest refLockRecord)
+inline bool Lock::isValidLockRequest(const LockRequest& refLockRecord)
 {
 
     // validate the locktype
@@ -534,7 +534,7 @@
     return true;
 }
 
-inline Rc Lock::isConflictWithTable(const LockRequests refLockRequestStructure)
+inline Rc Lock::isConflictWithTable(const LockRequests& refLockRequestStructure)
 {
 
     uint32_t transactionId;
@@ -588,7 +588,7 @@
     return std::make_pair(false, transactionId);
 }
 
-inline bool Lock::isConflictRequest(const LockRequests refLockRequestStructure)
+inline bool Lock::isConflictRequest(const LockRequests& refLockRequestStructure)
 {
     // check for all the locks coming in as a part of single request
     // return conflict if any two lock requests are conflicting
@@ -647,8 +647,8 @@
     return true;
 }
 
-inline bool Lock::isConflictRecord(const LockRequest refLockRecord1,
-                                   const LockRequest refLockRecord2)
+inline bool Lock::isConflictRecord(const LockRequest& refLockRecord1,
+                                   const LockRequest& refLockRecord2)
 {
     // No conflict if both are read locks
 
diff --git a/include/kvm_websocket.hpp b/include/kvm_websocket.hpp
index fea3840..477582a 100644
--- a/include/kvm_websocket.hpp
+++ b/include/kvm_websocket.hpp
@@ -162,7 +162,7 @@
         .privileges({"ConfigureComponents", "ConfigureManager"})
         .websocket()
         .onopen([](crow::websocket::Connection& conn,
-                   std::shared_ptr<bmcweb::AsyncResp>) {
+                   const std::shared_ptr<bmcweb::AsyncResp>&) {
             BMCWEB_LOG_DEBUG << "Connection " << &conn << " opened";
 
             if (sessions.size() == maxSessions)
diff --git a/include/obmc_console.hpp b/include/obmc_console.hpp
index 06df7fd..020ef91 100644
--- a/include/obmc_console.hpp
+++ b/include/obmc_console.hpp
@@ -108,7 +108,7 @@
         .privileges({"ConfigureComponents", "ConfigureManager"})
         .websocket()
         .onopen([](crow::websocket::Connection& conn,
-                   std::shared_ptr<bmcweb::AsyncResp>) {
+                   const std::shared_ptr<bmcweb::AsyncResp>&) {
             BMCWEB_LOG_DEBUG << "Connection " << &conn << " opened";
 
             sessions.insert(&conn);
diff --git a/include/openbmc_dbus_rest.hpp b/include/openbmc_dbus_rest.hpp
index 2c801c7..01c70e2 100644
--- a/include/openbmc_dbus_rest.hpp
+++ b/include/openbmc_dbus_rest.hpp
@@ -26,6 +26,7 @@
 #include <filesystem>
 #include <fstream>
 #include <regex>
+#include <utility>
 
 namespace crow
 {
@@ -66,9 +67,10 @@
                      {"status", "error"}};
 }
 
-inline void introspectObjects(const std::string& processName,
-                              const std::string& objectPath,
-                              std::shared_ptr<bmcweb::AsyncResp> transaction)
+inline void
+    introspectObjects(const std::string& processName,
+                      const std::string& objectPath,
+                      const std::shared_ptr<bmcweb::AsyncResp>& transaction)
 {
     if (transaction->res.jsonValue.is_null())
     {
@@ -130,7 +132,8 @@
 
 inline void getPropertiesForEnumerate(
     const std::string& objectPath, const std::string& service,
-    const std::string& interface, std::shared_ptr<bmcweb::AsyncResp> asyncResp)
+    const std::string& interface,
+    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
 {
     BMCWEB_LOG_DEBUG << "getPropertiesForEnumerate " << objectPath << " "
                      << service << " " << interface;
@@ -169,8 +172,9 @@
 // Find any results that weren't picked up by ObjectManagers, to be
 // called after all ObjectManagers are searched for and called.
 inline void findRemainingObjectsForEnumerate(
-    const std::string& objectPath, std::shared_ptr<GetSubTreeType> subtree,
-    std::shared_ptr<bmcweb::AsyncResp> asyncResp)
+    const std::string& objectPath,
+    const std::shared_ptr<GetSubTreeType>& subtree,
+    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
 {
     BMCWEB_LOG_DEBUG << "findRemainingObjectsForEnumerate";
     const nlohmann::json& dataJson = asyncResp->res.jsonValue["data"];
@@ -204,7 +208,7 @@
     InProgressEnumerateData(const std::string& objectPathIn,
                             std::shared_ptr<bmcweb::AsyncResp> asyncRespIn) :
         objectPath(objectPathIn),
-        asyncResp(asyncRespIn)
+        asyncResp(std::move(asyncRespIn))
     {}
 
     ~InProgressEnumerateData()
@@ -220,7 +224,7 @@
 inline void getManagedObjectsForEnumerate(
     const std::string& object_name, const std::string& object_manager_path,
     const std::string& connection_name,
-    std::shared_ptr<InProgressEnumerateData> transaction)
+    const std::shared_ptr<InProgressEnumerateData>& transaction)
 {
     BMCWEB_LOG_DEBUG << "getManagedObjectsForEnumerate " << object_name
                      << " object_manager_path " << object_manager_path
@@ -280,7 +284,7 @@
 
 inline void findObjectManagerPathForEnumerate(
     const std::string& object_name, const std::string& connection_name,
-    std::shared_ptr<InProgressEnumerateData> transaction)
+    const std::shared_ptr<InProgressEnumerateData>& transaction)
 {
     BMCWEB_LOG_DEBUG << "Finding objectmanager for path " << object_name
                      << " on connection:" << connection_name;
@@ -322,8 +326,8 @@
 // Uses GetObject to add the object info about the target /enumerate path to
 // the results of GetSubTree, as GetSubTree will not return info for the
 // target path, and then continues on enumerating the rest of the tree.
-inline void
-    getObjectAndEnumerate(std::shared_ptr<InProgressEnumerateData> transaction)
+inline void getObjectAndEnumerate(
+    const std::shared_ptr<InProgressEnumerateData>& transaction)
 {
     using GetObjectType =
         std::vector<std::pair<std::string, std::vector<std::string>>>;
@@ -1237,10 +1241,9 @@
     return 0;
 }
 
-inline void
-    handleMethodResponse(std::shared_ptr<InProgressActionData> transaction,
-                         sdbusplus::message::message& m,
-                         const std::string& returnType)
+inline void handleMethodResponse(
+    const std::shared_ptr<InProgressActionData>& transaction,
+    sdbusplus::message::message& m, const std::string& returnType)
 {
     nlohmann::json data;
 
@@ -1302,9 +1305,9 @@
     }
 }
 
-inline void
-    findActionOnInterface(std::shared_ptr<InProgressActionData> transaction,
-                          const std::string& connectionName)
+inline void findActionOnInterface(
+    const std::shared_ptr<InProgressActionData>& transaction,
+    const std::string& connectionName)
 {
     BMCWEB_LOG_DEBUG << "findActionOnInterface for connection "
                      << connectionName;
diff --git a/include/sessions.hpp b/include/sessions.hpp
index 95459b3..88fd487 100644
--- a/include/sessions.hpp
+++ b/include/sessions.hpp
@@ -269,7 +269,7 @@
         return nullptr;
     }
 
-    void removeSession(std::shared_ptr<UserSession> session)
+    void removeSession(const std::shared_ptr<UserSession>& session)
     {
 #ifdef BMCWEB_ENABLE_IBM_MANAGEMENT_CONSOLE
         crow::ibm_mc_lock::Lock::getInstance().releaseLock(session->uniqueId);
diff --git a/include/vm_websocket.hpp b/include/vm_websocket.hpp
index 8521993..3d8abe4 100644
--- a/include/vm_websocket.hpp
+++ b/include/vm_websocket.hpp
@@ -160,7 +160,7 @@
         .privileges({"ConfigureComponents", "ConfigureManager"})
         .websocket()
         .onopen([](crow::websocket::Connection& conn,
-                   std::shared_ptr<bmcweb::AsyncResp>) {
+                   const std::shared_ptr<bmcweb::AsyncResp>&) {
             BMCWEB_LOG_DEBUG << "Connection " << &conn << " opened";
 
             if (session != nullptr)
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;
