diff --git a/redfish-core/lib/ethernet.hpp b/redfish-core/lib/ethernet.hpp
index aa8d66f..01111a4 100644
--- a/redfish-core/lib/ethernet.hpp
+++ b/redfish-core/lib/ethernet.hpp
@@ -645,7 +645,6 @@
           this, ethifaceId{std::move(ethifaceId)}, callback{std::move(callback)}
         ](const boost::system::error_code error_code,
           const GetManagedObjectsType &resp) {
-
           EthernetInterfaceData ethData{};
           std::vector<IPv4AddressData> ipv4Data;
           ipv4Data.reserve(maxIpV4AddressesPerInterface);
@@ -1467,10 +1466,10 @@
       return;
     }
 
-    const std::string &parent_ifaceId = params[0];
+    const std::string &parentIfaceId = params[0];
     const std::string &ifaceId = params[1];
 
-    if (!verifyNames(res, parent_ifaceId, ifaceId)) {
+    if (!verifyNames(res, parentIfaceId, ifaceId)) {
       return;
     }
 
@@ -1483,7 +1482,7 @@
     // Get single eth interface data, and call the below callback for JSON
     // preparation
     ethernetProvider.getEthernetIfaceData(
-        ifaceId, [&, parent_ifaceId, ifaceId, patchReq = std::move(patchReq) ](
+        ifaceId, [&, parentIfaceId, ifaceId, patchReq = std::move(patchReq) ](
                      const bool &success, const EthernetInterfaceData &eth_data,
                      const std::vector<IPv4AddressData> &ipv4_data) {
           if (!success) {
@@ -1501,7 +1500,7 @@
           }
 
           res.jsonValue =
-              parseInterfaceData(parent_ifaceId, ifaceId, eth_data, ipv4_data);
+              parseInterfaceData(parentIfaceId, ifaceId, eth_data, ipv4_data);
 
           std::shared_ptr<AsyncResp> asyncResp =
               std::make_shared<AsyncResp>(res);
@@ -1538,22 +1537,22 @@
       return;
     }
 
-    const std::string &parent_ifaceId = params[0];
+    const std::string &parentIfaceId = params[0];
     const std::string &ifaceId = params[1];
 
-    if (!verifyNames(res, parent_ifaceId, ifaceId)) {
+    if (!verifyNames(res, parentIfaceId, ifaceId)) {
       return;
     }
 
     // Get single eth interface data, and call the below callback for JSON
     // preparation
     ethernetProvider.getEthernetIfaceData(
-        ifaceId, [&, parent_ifaceId, ifaceId](
+        ifaceId, [&, parentIfaceId, ifaceId](
                      const bool &success, const EthernetInterfaceData &eth_data,
                      const std::vector<IPv4AddressData> &ipv4_data) {
           if (success && eth_data.vlanId != nullptr) {
-            res.jsonValue = parseInterfaceData(parent_ifaceId, ifaceId,
-                                               eth_data, ipv4_data);
+            res.jsonValue =
+                parseInterfaceData(parentIfaceId, ifaceId, eth_data, ipv4_data);
 
             // Disable VLAN
             OnDemandEthernetProvider::disableVlan(
diff --git a/redfish-core/lib/sensors.hpp b/redfish-core/lib/sensors.hpp
index 9aa1da4..7f9fa68 100644
--- a/redfish-core/lib/sensors.hpp
+++ b/redfish-core/lib/sensors.hpp
@@ -24,7 +24,7 @@
 
 namespace redfish {
 
-constexpr const char* DBUS_SENSOR_PREFIX = "/xyz/openbmc_project/sensors/";
+constexpr const char* dbusSensorPrefix = "/xyz/openbmc_project/sensors/";
 
 using GetSubTreeType = std::vector<
     std::pair<std::string,
diff --git a/redfish-core/lib/systems.hpp b/redfish-core/lib/systems.hpp
index f1c3d92..b7f91b9 100644
--- a/redfish-core/lib/systems.hpp
+++ b/redfish-core/lib/systems.hpp
@@ -69,25 +69,25 @@
                                         const std::vector<std::string> &resp) {
           // Callback requires vector<string> to retrieve all available board
           // list.
-          std::vector<std::string> board_list;
+          std::vector<std::string> boardList;
           if (ec) {
             // Something wrong on DBus, the error_code is not important at this
             // moment, just return success=false, and empty output. Since size
             // of vector may vary depending on information from Entity Manager,
             // and empty output could not be treated same way as error.
-            callback(false, board_list);
+            callback(false, boardList);
             return;
           }
           BMCWEB_LOG_DEBUG << "Got " << resp.size() << " boards.";
           // Iterate over all retrieved ObjectPaths.
           for (const std::string &objpath : resp) {
-            std::size_t last_pos = objpath.rfind("/");
-            if (last_pos != std::string::npos) {
-              board_list.emplace_back(objpath.substr(last_pos + 1));
+            std::size_t lastPos = objpath.rfind("/");
+            if (lastPos != std::string::npos) {
+              boardList.emplace_back(objpath.substr(lastPos + 1));
             }
           }
           // Finally make a callback with useful data
-          callback(true, board_list);
+          callback(true, boardList);
         },
         "xyz.openbmc_project.ObjectMapper",
         "/xyz/openbmc_project/object_mapper",
@@ -493,9 +493,9 @@
           if (success) {
             // ... prepare json array with appropriate @odata.id links
             nlohmann::json boardArray = nlohmann::json::array();
-            for (const std::string &board_item : output) {
+            for (const std::string &boardItem : output) {
               boardArray.push_back(
-                  {{"@odata.id", "/redfish/v1/Systems/" + board_item}});
+                  {{"@odata.id", "/redfish/v1/Systems/" + boardItem}});
             }
             // Then attach members, count size and return,
             Node::json["Members"] = boardArray;
