diff --git a/src/EntityManager.cpp b/src/EntityManager.cpp
index 1832fb1..c6e22ef 100644
--- a/src/EntityManager.cpp
+++ b/src/EntityManager.cpp
@@ -181,9 +181,9 @@
             {
                 connection->async_method_call(
                     [conn,
-                     interface](boost::system::error_code& ec,
+                     interface](boost::system::error_code& errc,
                                 const ManagedObjectType& managedInterface) {
-                        if (ec)
+                        if (errc)
                         {
                             std::cerr
                                 << "error getting managed object for device "
@@ -246,12 +246,12 @@
                     case nlohmann::json::value_t::string:
                     {
                         std::regex search(match.second.get<std::string>());
-                        std::smatch match;
+                        std::smatch regMatch;
 
                         // convert value to string respresentation
                         std::string probeValue = std::visit(
                             VariantToStringVisitor(), deviceValue->second);
-                        if (!std::regex_search(probeValue, match, search))
+                        if (!std::regex_search(probeValue, regMatch, search))
                         {
                             deviceMatches = false;
                             break;
@@ -484,8 +484,6 @@
     void run()
     {
         // parse out dbus probes by discarding other probe types
-        boost::container::flat_map<const char*, probe_type_codes,
-                                   cmp_str>::const_iterator probeType;
 
         for (std::string& probe : _probeCommand)
         {
@@ -543,7 +541,7 @@
         ref = value;
         return true;
     }
-    catch (const std::out_of_range)
+    catch (const std::out_of_range&)
     {
         return false;
     }
@@ -639,16 +637,16 @@
     iface->register_method(
         "Delete", [&objServer, &systemConfiguration, interface,
                    jsonPointerPath{std::string(jsonPointerPath)}]() {
-            std::shared_ptr<sdbusplus::asio::dbus_interface> iface =
+            std::shared_ptr<sdbusplus::asio::dbus_interface> dbusInterface =
                 interface.lock();
-            if (!iface)
+            if (!dbusInterface)
             {
                 // this technically can't happen as the pointer is pointing to
                 // us
                 throw DBusInternalError();
             }
             nlohmann::json::json_pointer ptr(jsonPointerPath);
-            if (!objServer.remove_interface(iface))
+            if (!objServer.remove_interface(dbusInterface))
             {
                 std::cerr << "Can't delete interface " << jsonPointerPath
                           << "\n";
@@ -925,7 +923,7 @@
 
             std::regex_replace(dbusName.begin(), dbusName.begin(),
                                dbusName.end(), ILLEGAL_DBUS_MEMBER_REGEX, "_");
-            auto iface = objServer.add_interface(
+            auto interface = objServer.add_interface(
                 path + "/" + dbusName,
                 "xyz.openbmc_project.Configuration." + *type);
             // permission is read-write, as since we just created it, must be
@@ -933,7 +931,7 @@
             populateInterfaceFromJson(
                 systemConfiguration,
                 jsonPointerPath + "/Exposes/" + std::to_string(lastIndex),
-                iface, newData, objServer,
+                interface, newData, objServer,
                 sdbusplus::asio::PropertyPermission::readWrite);
         });
     iface->initialize();
@@ -1317,10 +1315,10 @@
                 keyPair.value() = static_cast<uint64_t>(temp);
             }
         }
-        catch (std::invalid_argument)
+        catch (std::invalid_argument&)
         {
         }
-        catch (std::out_of_range)
+        catch (std::out_of_range&)
         {
         }
     }
@@ -1650,7 +1648,6 @@
 };
 
 void startRemovedTimer(boost::asio::deadline_timer& timer,
-                       std::vector<sdbusplus::bus::match::match>& dbusMatches,
                        nlohmann::json& systemConfiguration)
 {
     static bool scannedPowerOff = false;
@@ -1789,8 +1786,7 @@
                                    objServer);
                         if (!timerRunning)
                         {
-                            startRemovedTimer(timer, dbusMatches,
-                                              systemConfiguration);
+                            startRemovedTimer(timer, systemConfiguration);
                         }
                     });
                 });
@@ -1830,7 +1826,7 @@
     }
 }
 
-int main(int argc, char** argv)
+int main()
 {
     // setup connection to dbus
     boost::asio::io_service io;
@@ -1857,8 +1853,9 @@
         "Notify",
         [](const boost::container::flat_map<
             std::string,
-            boost::container::flat_map<std::string, BasicVariantType>>&
-               object) { return; });
+            boost::container::flat_map<std::string, BasicVariantType>>&) {
+            return;
+        });
     inventoryIface->initialize();
 
     io.post([&]() {
diff --git a/src/FruDevice.cpp b/src/FruDevice.cpp
index d129403..baa90d4 100644
--- a/src/FruDevice.cpp
+++ b/src/FruDevice.cpp
@@ -96,8 +96,8 @@
 static int read_block_data(int flag, int file, uint16_t offset, uint8_t len,
                            uint8_t* buf)
 {
-    uint8_t low_addr = offset & 0xFF;
-    uint8_t high_addr = (offset >> 8) & 0xFF;
+    uint8_t low_addr = static_cast<uint8_t>(offset);
+    uint8_t high_addr = static_cast<uint8_t>(offset >> 8);
 
     if (flag == 0)
     {
@@ -217,7 +217,7 @@
                     auto area_offset = device[jj];
                     if (area_offset != 0)
                     {
-                        area_offset *= 8;
+                        area_offset = static_cast<char>(area_offset * 8);
                         if (read_block_data(flag, file, area_offset, 0x8,
                                             block_data.data()) < 0)
                         {
@@ -229,12 +229,14 @@
                         device.insert(device.end(), block_data.begin(),
                                       block_data.begin() + 8);
                         length -= 8;
-                        area_offset += 8;
+                        area_offset = static_cast<char>(area_offset + 8);
 
                         while (length > 0)
                         {
                             auto to_get = std::min(0x20, length);
-                            if (read_block_data(flag, file, area_offset, to_get,
+
+                            if (read_block_data(flag, file, area_offset,
+                                                static_cast<uint8_t>(to_get),
                                                 block_data.data()) < 0)
                             {
                                 std::cerr << "failed to read bus " << bus
@@ -243,7 +245,8 @@
                             }
                             device.insert(device.end(), block_data.begin(),
                                           block_data.begin() + to_get);
-                            area_offset += to_get;
+                            area_offset =
+                                static_cast<char>(area_offset + to_get);
                             length -= to_get;
                         }
                     }
@@ -273,8 +276,7 @@
 }
 
 static void FindI2CDevices(const std::vector<fs::path>& i2cBuses,
-                           std::shared_ptr<FindDevicesWithCallback> context,
-                           boost::asio::io_service& io, BusMap& busMap)
+                           BusMap& busmap)
 {
     for (auto& i2cBus : i2cBuses)
     {
@@ -314,7 +316,7 @@
                       << bus << "\n";
             continue;
         }
-        auto& device = busMap[bus];
+        auto& device = busmap[bus];
         device = std::make_shared<DeviceMap>();
 
         //  i2cdetect by default uses the range 0x03 to 0x77, as
@@ -340,10 +342,10 @@
     : std::enable_shared_from_this<FindDevicesWithCallback>
 {
     FindDevicesWithCallback(const std::vector<fs::path>& i2cBuses,
-                            boost::asio::io_service& io, BusMap& busMap,
+                            boost::asio::io_service& io, BusMap& busmap,
                             std::function<void(void)>&& callback) :
         _i2cBuses(i2cBuses),
-        _io(io), _busMap(busMap), _callback(std::move(callback))
+        _io(io), _busMap(busmap), _callback(std::move(callback))
     {
     }
     ~FindDevicesWithCallback()
@@ -352,7 +354,7 @@
     }
     void run()
     {
-        FindI2CDevices(_i2cBuses, shared_from_this(), _io, _busMap);
+        FindI2CDevices(_i2cBuses, _busMap);
     }
 
     const std::vector<fs::path>& _i2cBuses;
@@ -363,7 +365,7 @@
 
 static const std::tm intelEpoch(void)
 {
-    std::tm val = {0};
+    std::tm val = {};
     val.tm_year = 1996 - 1900;
     return val;
 }
@@ -464,7 +466,7 @@
 
                 /* Checking for last byte C1 to indicate that no more
                  * field to be read */
-                if (*fruBytesIter == 0xC1)
+                if (static_cast<uint8_t>(*fruBytesIter) == 0xC1)
                 {
                     break;
                 }
@@ -531,7 +533,6 @@
 }
 
 void AddFruObjectToDbus(
-    std::shared_ptr<sdbusplus::asio::connection> dbusConn,
     std::vector<char>& device, sdbusplus::asio::object_server& objServer,
     boost::container::flat_map<
         std::pair<size_t, size_t>,
@@ -573,8 +574,10 @@
             if ((busIface.second->get_object_path() == productName))
             {
                 if (isMuxBus(bus) && address == busIface.first.second &&
-                    (getFruInfo(busIface.first.first, busIface.first.second) ==
-                     getFruInfo(bus, address)))
+                    (getFruInfo(static_cast<uint8_t>(busIface.first.first),
+                                static_cast<uint8_t>(busIface.first.second)) ==
+                     getFruInfo(static_cast<uint8_t>(bus),
+                                static_cast<uint8_t>(address))))
                 {
                     // This device is already added to the lower numbered bus,
                     // do not replicate it.
@@ -634,7 +637,7 @@
     if (baseboardFruFile.good())
     {
         baseboardFruFile.seekg(0, std::ios_base::end);
-        std::streampos fileSize = baseboardFruFile.tellg();
+        size_t fileSize = static_cast<size_t>(baseboardFruFile.tellg());
         baseboardFru.resize(fileSize);
         baseboardFruFile.seekg(0, std::ios_base::beg);
         baseboardFruFile.read(baseboardFru.data(), fileSize);
@@ -712,7 +715,8 @@
                 }
             }
 
-            if (i2c_smbus_write_byte_data(file, index & 0xFF, fru[index]) < 0)
+            if (i2c_smbus_write_byte_data(file, static_cast<uint8_t>(index),
+                                          fru[index]) < 0)
             {
                 if (!retries--)
                 {
@@ -737,18 +741,17 @@
 }
 
 void rescanBusses(
-    boost::asio::io_service& io, BusMap& busMap,
+    boost::asio::io_service& io, BusMap& busmap,
     boost::container::flat_map<
         std::pair<size_t, size_t>,
         std::shared_ptr<sdbusplus::asio::dbus_interface>>& dbusInterfaceMap,
-    std::shared_ptr<sdbusplus::asio::connection>& systemBus,
     sdbusplus::asio::object_server& objServer)
 {
     static boost::asio::deadline_timer timer(io);
     timer.expires_from_now(boost::posix_time::seconds(1));
 
     // setup an async wait in case we get flooded with requests
-    timer.async_wait([&](const boost::system::error_code& ec) {
+    timer.async_wait([&](const boost::system::error_code&) {
         auto devDir = fs::path("/dev/");
         std::vector<fs::path> i2cBuses;
 
@@ -764,9 +767,9 @@
             i2cBuses.emplace_back(busPath.second);
         }
 
-        busMap.clear();
+        busmap.clear();
         auto scan = std::make_shared<FindDevicesWithCallback>(
-            i2cBuses, io, busMap, [&]() {
+            i2cBuses, io, busmap, [&]() {
                 for (auto& busIface : dbusInterfaceMap)
                 {
                     objServer.remove_interface(busIface.second);
@@ -782,13 +785,13 @@
                     boost::container::flat_map<int, std::vector<char>>
                         baseboardDev;
                     baseboardDev.emplace(0, baseboardFru);
-                    busMap[0] = std::make_shared<DeviceMap>(baseboardDev);
+                    busmap[0] = std::make_shared<DeviceMap>(baseboardDev);
                 }
-                for (auto& devicemap : busMap)
+                for (auto& devicemap : busmap)
                 {
                     for (auto& device : *devicemap.second)
                     {
-                        AddFruObjectToDbus(systemBus, device.second, objServer,
+                        AddFruObjectToDbus(device.second, objServer,
                                            dbusInterfaceMap, devicemap.first,
                                            device.first);
                     }
@@ -798,7 +801,7 @@
     });
 }
 
-int main(int argc, char** argv)
+int main()
 {
     auto devDir = fs::path("/dev/");
     auto matchString = std::string(R"(i2c-\d+$)");
@@ -826,7 +829,7 @@
                                 "xyz.openbmc_project.FruDeviceManager");
 
     iface->register_method("ReScan", [&]() {
-        rescanBusses(io, busMap, dbusInterfaceMap, systemBus, objServer);
+        rescanBusses(io, busMap, dbusInterfaceMap, objServer);
     });
 
     iface->register_method("GetRawFru", getFruInfo);
@@ -840,7 +843,7 @@
             return;
         }
         // schedule rescan on success
-        rescanBusses(io, busMap, dbusInterfaceMap, systemBus, objServer);
+        rescanBusses(io, busMap, dbusInterfaceMap, objServer);
     });
     iface->initialize();
 
@@ -856,8 +859,7 @@
             if (findPgood != values.end())
             {
 
-                rescanBusses(io, busMap, dbusInterfaceMap, systemBus,
-                             objServer);
+                rescanBusses(io, busMap, dbusInterfaceMap, objServer);
             }
         };
 
@@ -906,8 +908,7 @@
             }
             if (devChange)
             {
-                rescanBusses(io, busMap, dbusInterfaceMap, systemBus,
-                             objServer);
+                rescanBusses(io, busMap, dbusInterfaceMap, objServer);
             }
 
             dirWatch.async_read_some(boost::asio::buffer(readBuffer),
@@ -916,7 +917,7 @@
 
     dirWatch.async_read_some(boost::asio::buffer(readBuffer), watchI2cBusses);
     // run the initial scan
-    rescanBusses(io, busMap, dbusInterfaceMap, systemBus, objServer);
+    rescanBusses(io, busMap, dbusInterfaceMap, objServer);
 
     io.run();
     return 0;
diff --git a/src/Overlay.cpp b/src/Overlay.cpp
index 3d30068..3877ff2 100644
--- a/src/Overlay.cpp
+++ b/src/Overlay.cpp
@@ -122,8 +122,6 @@
     std::filesystem::path devDir(I2C_DEVS_DIR);
     devDir /= std::to_string(busIndex) + "-" + hexAddress.str();
 
-    std::string channelName;
-
     for (std::size_t channelIndex = 0; channelIndex < channelNames.size();
          channelIndex++)
     {
@@ -248,7 +246,8 @@
     deviceFile.close();
     if (boost::ends_with(type, "Mux") && bus && address && channels)
     {
-        linkMux(name, *bus, *address, *channels);
+        linkMux(name, static_cast<size_t>(*bus), static_cast<size_t>(*address),
+                *channels);
     }
 }
 
@@ -277,7 +276,7 @@
         if (keyPair.key() == "Bus" &&
             keyPair.value().type() == nlohmann::json::value_t::string)
         {
-            unsigned int dec =
+            long unsigned int dec =
                 std::stoul(keyPair.value().get<std::string>(), nullptr, 16);
             subsituteString = std::to_string(dec);
         }
