diff --git a/src/ADCSensor.cpp b/src/ADCSensor.cpp
index eb2587c..e06c8dd 100644
--- a/src/ADCSensor.cpp
+++ b/src/ADCSensor.cpp
@@ -36,13 +36,13 @@
 static constexpr double maxReading = 20;
 static constexpr double minReading = 0;
 
-ADCSensor::ADCSensor(const std::string &path,
-                     sdbusplus::asio::object_server &objectServer,
-                     std::shared_ptr<sdbusplus::asio::connection> &conn,
-                     boost::asio::io_service &io, const std::string &sensorName,
-                     std::vector<thresholds::Threshold> &&_thresholds,
+ADCSensor::ADCSensor(const std::string& path,
+                     sdbusplus::asio::object_server& objectServer,
+                     std::shared_ptr<sdbusplus::asio::connection>& conn,
+                     boost::asio::io_service& io, const std::string& sensorName,
+                     std::vector<thresholds::Threshold>&& _thresholds,
                      const double scaleFactor, PowerState readState,
-                     const std::string &sensorConfiguration) :
+                     const std::string& sensorConfiguration) :
     Sensor(boost::replace_all_copy(sensorName, " ", "_"), path,
            std::move(_thresholds), sensorConfiguration,
            "xyz.openbmc_project.Configuration.ADC", maxReading, minReading),
@@ -86,11 +86,11 @@
 {
     boost::asio::async_read_until(
         inputDev, readBuf, '\n',
-        [&](const boost::system::error_code &ec,
+        [&](const boost::system::error_code& ec,
             std::size_t /*bytes_transfered*/) { handleResponse(ec); });
 }
 
-void ADCSensor::handleResponse(const boost::system::error_code &err)
+void ADCSensor::handleResponse(const boost::system::error_code& err)
 {
     if (err == boost::system::errc::bad_file_descriptor)
     {
@@ -153,7 +153,7 @@
     }
     inputDev.assign(fd);
     waitTimer.expires_from_now(boost::posix_time::milliseconds(sensorPollMs));
-    waitTimer.async_wait([&](const boost::system::error_code &ec) {
+    waitTimer.async_wait([&](const boost::system::error_code& ec) {
         if (ec == boost::asio::error::operation_aborted)
         {
             return; // we're being canceled
diff --git a/src/CPUSensor.cpp b/src/CPUSensor.cpp
index 969a449..0d0dd1b 100644
--- a/src/CPUSensor.cpp
+++ b/src/CPUSensor.cpp
@@ -31,12 +31,12 @@
 static constexpr double maxReading = 127;
 static constexpr double minReading = -128;
 
-CPUSensor::CPUSensor(const std::string &path, const std::string &objectType,
-                     sdbusplus::asio::object_server &objectServer,
-                     std::shared_ptr<sdbusplus::asio::connection> &conn,
-                     boost::asio::io_service &io, const std::string &sensorName,
-                     std::vector<thresholds::Threshold> &&_thresholds,
-                     const std::string &sensorConfiguration) :
+CPUSensor::CPUSensor(const std::string& path, const std::string& objectType,
+                     sdbusplus::asio::object_server& objectServer,
+                     std::shared_ptr<sdbusplus::asio::connection>& conn,
+                     boost::asio::io_service& io, const std::string& sensorName,
+                     std::vector<thresholds::Threshold>&& _thresholds,
+                     const std::string& sensorConfiguration) :
     Sensor(boost::replace_all_copy(sensorName, " ", "_"), path,
            std::move(_thresholds), sensorConfiguration, objectType, maxReading,
            minReading),
@@ -78,11 +78,11 @@
 {
     boost::asio::async_read_until(
         inputDev, readBuf, '\n',
-        [&](const boost::system::error_code &ec,
+        [&](const boost::system::error_code& ec,
             std::size_t /*bytes_transfered*/) { handleResponse(ec); });
 }
 
-void CPUSensor::handleResponse(const boost::system::error_code &err)
+void CPUSensor::handleResponse(const boost::system::error_code& err)
 {
     if (err == boost::system::errc::bad_file_descriptor)
     {
@@ -109,7 +109,7 @@
             }
             errCount = 0;
         }
-        catch (const std::invalid_argument &)
+        catch (const std::invalid_argument&)
         {
             errCount++;
         }
@@ -150,7 +150,7 @@
     }
     inputDev.assign(fd);
     waitTimer.expires_from_now(boost::posix_time::milliseconds(pollTime));
-    waitTimer.async_wait([&](const boost::system::error_code &ec) {
+    waitTimer.async_wait([&](const boost::system::error_code& ec) {
         if (ec == boost::asio::error::operation_aborted)
         {
             return; // we're being canceled
diff --git a/src/HwmonTempSensor.cpp b/src/HwmonTempSensor.cpp
index 7d443ad..c7855f6 100644
--- a/src/HwmonTempSensor.cpp
+++ b/src/HwmonTempSensor.cpp
@@ -34,12 +34,12 @@
 static constexpr double minReading = -128;
 
 HwmonTempSensor::HwmonTempSensor(
-    const std::string &path, const std::string &objectType,
-    sdbusplus::asio::object_server &objectServer,
-    std::shared_ptr<sdbusplus::asio::connection> &conn,
-    boost::asio::io_service &io, const std::string &sensorName,
-    std::vector<thresholds::Threshold> &&_thresholds,
-    const std::string &sensorConfiguration) :
+    const std::string& path, const std::string& objectType,
+    sdbusplus::asio::object_server& objectServer,
+    std::shared_ptr<sdbusplus::asio::connection>& conn,
+    boost::asio::io_service& io, const std::string& sensorName,
+    std::vector<thresholds::Threshold>&& _thresholds,
+    const std::string& sensorConfiguration) :
     Sensor(boost::replace_all_copy(sensorName, " ", "_"), path,
            std::move(_thresholds), sensorConfiguration, objectType, maxReading,
            minReading),
@@ -80,11 +80,11 @@
 {
     boost::asio::async_read_until(
         inputDev, readBuf, '\n',
-        [&](const boost::system::error_code &ec,
+        [&](const boost::system::error_code& ec,
             std::size_t /*bytes_transfered*/) { handleResponse(ec); });
 }
 
-void HwmonTempSensor::handleResponse(const boost::system::error_code &err)
+void HwmonTempSensor::handleResponse(const boost::system::error_code& err)
 {
     if (err == boost::system::errc::bad_file_descriptor)
     {
@@ -109,7 +109,7 @@
             }
             errCount = 0;
         }
-        catch (const std::invalid_argument &)
+        catch (const std::invalid_argument&)
         {
             errCount++;
         }
@@ -139,7 +139,7 @@
     }
     inputDev.assign(fd);
     waitTimer.expires_from_now(boost::posix_time::milliseconds(sensorPollMs));
-    waitTimer.async_wait([&](const boost::system::error_code &ec) {
+    waitTimer.async_wait([&](const boost::system::error_code& ec) {
         if (ec == boost::asio::error::operation_aborted)
         {
             return; // we're being canceled
diff --git a/src/TachSensor.cpp b/src/TachSensor.cpp
index d16c36b..a88c248 100644
--- a/src/TachSensor.cpp
+++ b/src/TachSensor.cpp
@@ -31,15 +31,15 @@
 static constexpr unsigned int pwmPollMs = 500;
 static constexpr size_t warnAfterErrorCount = 10;
 
-TachSensor::TachSensor(const std::string &path, const std::string &objectType,
-                       sdbusplus::asio::object_server &objectServer,
-                       std::shared_ptr<sdbusplus::asio::connection> &conn,
-                       std::unique_ptr<PresenceSensor> &&presence,
-                       const std::shared_ptr<RedundancySensor> &redundancy,
-                       boost::asio::io_service &io, const std::string &fanName,
-                       std::vector<thresholds::Threshold> &&_thresholds,
-                       const std::string &sensorConfiguration,
-                       const std::pair<size_t, size_t> &limits) :
+TachSensor::TachSensor(const std::string& path, const std::string& objectType,
+                       sdbusplus::asio::object_server& objectServer,
+                       std::shared_ptr<sdbusplus::asio::connection>& conn,
+                       std::unique_ptr<PresenceSensor>&& presence,
+                       const std::shared_ptr<RedundancySensor>& redundancy,
+                       boost::asio::io_service& io, const std::string& fanName,
+                       std::vector<thresholds::Threshold>&& _thresholds,
+                       const std::string& sensorConfiguration,
+                       const std::pair<size_t, size_t>& limits) :
     Sensor(boost::replace_all_copy(fanName, " ", "_"), path,
            std::move(_thresholds), sensorConfiguration, objectType,
            limits.second, limits.first),
@@ -82,11 +82,11 @@
 {
     boost::asio::async_read_until(
         inputDev, readBuf, '\n',
-        [&](const boost::system::error_code &ec,
+        [&](const boost::system::error_code& ec,
             std::size_t /*bytes_transfered*/) { handleResponse(ec); });
 }
 
-void TachSensor::handleResponse(const boost::system::error_code &err)
+void TachSensor::handleResponse(const boost::system::error_code& err)
 {
     if (err == boost::system::errc::bad_file_descriptor)
     {
@@ -124,7 +124,7 @@
                 }
                 errCount = 0;
             }
-            catch (const std::invalid_argument &)
+            catch (const std::invalid_argument&)
             {
                 errCount++;
             }
@@ -162,7 +162,7 @@
     }
     inputDev.assign(fd);
     waitTimer.expires_from_now(boost::posix_time::milliseconds(pollTime));
-    waitTimer.async_wait([&](const boost::system::error_code &ec) {
+    waitTimer.async_wait([&](const boost::system::error_code& ec) {
         if (ec == boost::asio::error::operation_aborted)
         {
             return; // we're being canceled
@@ -182,7 +182,7 @@
 }
 
 PresenceSensor::PresenceSensor(const size_t index, bool inverted,
-                               boost::asio::io_service &io) :
+                               boost::asio::io_service& io) :
     inverted(inverted),
     inputDev(io)
 {
@@ -218,7 +218,7 @@
 void PresenceSensor::monitorPresence(void)
 {
     inputDev.async_wait(boost::asio::ip::tcp::socket::wait_error,
-                        [this](const boost::system::error_code &ec) {
+                        [this](const boost::system::error_code& ec) {
                             if (ec == boost::system::errc::bad_file_descriptor)
                             {
                                 return; // we're being destroyed
@@ -264,8 +264,8 @@
 }
 
 RedundancySensor::RedundancySensor(
-    size_t count, const std::vector<std::string> &children,
-    sdbusplus::asio::object_server &objectServer) :
+    size_t count, const std::vector<std::string>& children,
+    sdbusplus::asio::object_server& objectServer) :
     count(count),
     iface(objectServer.add_interface(
         "/xyz/openbmc_project/control/FanRedundancy/Tach",
@@ -281,13 +281,13 @@
 {
     objectServer.remove_interface(iface);
 }
-void RedundancySensor::update(const std::string &name, bool failed)
+void RedundancySensor::update(const std::string& name, bool failed)
 {
     statuses[name] = failed;
     size_t failedCount = 0;
 
     std::string state = "Full";
-    for (const auto &status : statuses)
+    for (const auto& status : statuses)
     {
         if (status.second)
         {
diff --git a/src/Thresholds.cpp b/src/Thresholds.cpp
index 1494396..725829e 100644
--- a/src/Thresholds.cpp
+++ b/src/Thresholds.cpp
@@ -12,7 +12,7 @@
 
 namespace thresholds
 {
-unsigned int toBusValue(const Level &level)
+unsigned int toBusValue(const Level& level)
 {
     switch (level)
     {
@@ -31,7 +31,7 @@
     }
 }
 
-std::string toBusValue(const Direction &direction)
+std::string toBusValue(const Direction& direction)
 {
     switch (direction)
     {
@@ -51,11 +51,11 @@
 }
 
 bool parseThresholdsFromConfig(
-    const SensorData &sensorData,
-    std::vector<thresholds::Threshold> &thresholdVector,
-    const std::string *matchLabel)
+    const SensorData& sensorData,
+    std::vector<thresholds::Threshold>& thresholdVector,
+    const std::string* matchLabel)
 {
-    for (const auto &item : sensorData)
+    for (const auto& item : sensorData)
     {
         if (item.first.find("Thresholds") == std::string::npos)
         {
@@ -107,9 +107,9 @@
     return true;
 }
 
-void persistThreshold(const std::string &path, const std::string &baseInterface,
-                      const thresholds::Threshold &threshold,
-                      std::shared_ptr<sdbusplus::asio::connection> &conn)
+void persistThreshold(const std::string& path, const std::string& baseInterface,
+                      const thresholds::Threshold& threshold,
+                      std::shared_ptr<sdbusplus::asio::connection>& conn)
 {
     for (int ii = 0; ii < maxThresholds; ii++)
     {
@@ -117,9 +117,9 @@
             baseInterface + ".Thresholds" + std::to_string(ii);
         conn->async_method_call(
             [&, path, threshold, thresholdInterface](
-                const boost::system::error_code &ec,
-                const boost::container::flat_map<std::string, BasicVariantType>
-                    &result) {
+                const boost::system::error_code& ec,
+                const boost::container::flat_map<std::string, BasicVariantType>&
+                    result) {
                 if (ec)
                 {
                     return; // threshold not supported
@@ -147,7 +147,7 @@
 
                 std::variant<double> value(threshold.value);
                 conn->async_method_call(
-                    [](const boost::system::error_code &ec) {
+                    [](const boost::system::error_code& ec) {
                         if (ec)
                         {
                             std::cerr << "Error setting threshold " << ec
@@ -162,7 +162,7 @@
     }
 }
 
-bool checkThresholds(Sensor *sensor)
+bool checkThresholds(Sensor* sensor)
 {
     bool status = true;
 
@@ -170,7 +170,7 @@
     {
         return true;
     }
-    for (auto &threshold : sensor->thresholds)
+    for (auto& threshold : sensor->thresholds)
     {
         if (std::isnan(sensor->value))
         {
@@ -215,7 +215,7 @@
     return status;
 }
 
-void assertThresholds(Sensor *sensor, thresholds::Level level,
+void assertThresholds(Sensor* sensor, thresholds::Level level,
                       thresholds::Direction direction, bool assert)
 {
     std::string property;
@@ -258,14 +258,14 @@
     interface->set_property(property, assert);
 }
 
-static constexpr std::array<const char *, 4> attrTypes = {"lcrit", "min", "max",
-                                                          "crit"};
+static constexpr std::array<const char*, 4> attrTypes = {"lcrit", "min", "max",
+                                                         "crit"};
 
 bool parseThresholdsFromAttr(
-    std::vector<thresholds::Threshold> &thresholdVector,
-    const std::string &inputPath, const double &scaleFactor)
+    std::vector<thresholds::Threshold>& thresholdVector,
+    const std::string& inputPath, const double& scaleFactor)
 {
-    for (auto &type : attrTypes)
+    for (auto& type : attrTypes)
     {
         auto attrPath = boost::replace_all_copy(inputPath, "input", type);
         std::ifstream attrFile(attrPath);
@@ -309,9 +309,9 @@
 }
 
 bool hasCriticalInterface(
-    const std::vector<thresholds::Threshold> &thresholdVector)
+    const std::vector<thresholds::Threshold>& thresholdVector)
 {
-    for (auto &threshold : thresholdVector)
+    for (auto& threshold : thresholdVector)
     {
         if (threshold.level == Level::CRITICAL)
         {
@@ -322,9 +322,9 @@
 }
 
 bool hasWarningInterface(
-    const std::vector<thresholds::Threshold> &thresholdVector)
+    const std::vector<thresholds::Threshold>& thresholdVector)
 {
-    for (auto &threshold : thresholdVector)
+    for (auto& threshold : thresholdVector)
     {
         if (threshold.level == Level::WARNING)
         {
