diff --git a/CMakeLists.txt b/CMakeLists.txt
index 10d542e..497f886 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -4,10 +4,33 @@
 set (CMAKE_CXX_STANDARD 17)
 set (CMAKE_CXX_STANDARD_REQUIRED ON)
 set (CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})
-set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -Werror -Wall")
+set (
+    CMAKE_CXX_FLAGS
+    "${CMAKE_CXX_FLAGS} -lstdc++fs \
+    -Werror \
+    -Wall \
+    -Wextra \
+    -Wshadow \
+    -Wnon-virtual-dtor \
+    -Wold-style-cast \
+    -Wcast-align \
+    -Wunused \
+    -Woverloaded-virtual \
+    -Wpedantic \
+    -Wconversion \
+    -Wmisleading-indentation \
+    -Wduplicated-cond \
+    -Wduplicated-branches \
+    -Wlogical-op \
+    -Wnull-dereference \
+    -Wuseless-cast \
+    -Wdouble-promotion \
+    -Wformat=2 \
+"
+)
 
 # todo: fix these warnings
-set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-strict-aliasing -Wno-catch-value")
+set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-strict-aliasing -Wno-cast-align")
 
 set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-rtti")
 
@@ -59,14 +82,15 @@
                          && make -j libsdbusplus.la INSTALL_COMMAND ""
                          LOG_DOWNLOAD ON)
 
-    include_directories (${CMAKE_BINARY_DIR}/sdbusplus-src)
-    include_directories (${CMAKE_BINARY_DIR}/nlohmann/include)
-    include_directories (${CMAKE_BINARY_DIR}/nlohmann/include/nlohmann)
-    include_directories (${CMAKE_BINARY_DIR}/valijson/include)
-    include_directories (${CMAKE_BINARY_DIR}/phosphor-dbus-interfaces/include)
+    include_directories (SYSTEM ${CMAKE_BINARY_DIR}/sdbusplus-src)
+    include_directories (SYSTEM ${CMAKE_BINARY_DIR}/nlohmann/include)
+    include_directories (SYSTEM ${CMAKE_BINARY_DIR}/nlohmann/include/nlohmann)
+    include_directories (SYSTEM ${CMAKE_BINARY_DIR}/valijson/include)
+    include_directories (SYSTEM
+                         ${CMAKE_BINARY_DIR}/phosphor-dbus-interfaces/include)
     link_directories (${CMAKE_BINARY_DIR}/sdbusplus-src/.libs)
 
-    include_directories (${CMAKE_BINARY_DIR}/boost-src)
+    include_directories (SYSTEM ${CMAKE_BINARY_DIR}/boost-src)
     set (CMAKE_PREFIX_PATH ${CMAKE_BINARY_DIR}/boost-src ${CMAKE_PREFIX_PATH})
     option (ENABLE_TEST "Enable Google Test" OFF)
     if (ENABLE_TEST)
@@ -83,8 +107,6 @@
 add_definitions (-DBOOST_NO_TYPEID)
 
 include_directories (${CMAKE_CURRENT_SOURCE_DIR}/include)
-include_directories (${Boost_INCLUDE_DIRS})
-include_directories (${CMAKE_CURRENT_SOURCE_DIR}/include)
 
 add_executable (fru-device src/FruDevice.cpp src/Utils.cpp)
 
diff --git a/include/devices.hpp b/include/devices.hpp
index 0ba586e..81ef10c 100644
--- a/include/devices.hpp
+++ b/include/devices.hpp
@@ -30,8 +30,8 @@
 
 struct ExportTemplate
 {
-    ExportTemplate(const char* parameters, const char* device) :
-        parameters(parameters), device(device){};
+    ExportTemplate(const char* params, const char* dev) :
+        parameters(params), device(dev){};
     const char* parameters;
     const char* device;
 };
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);
         }
