diff --git a/src/EntityManager.cpp b/src/EntityManager.cpp
index 35fadb9..fb75856 100644
--- a/src/EntityManager.cpp
+++ b/src/EntityManager.cpp
@@ -38,9 +38,7 @@
 constexpr const char* schemaDirectory = PACKAGE_DIR "configurations/schemas";
 constexpr const char* globalSchema = "global.json";
 constexpr const char* TEMPLATE_CHAR = "$";
-constexpr const size_t PROPERTIES_CHANGED_UNTIL_FLUSH_COUNT = 20;
 constexpr const int32_t MAX_MAPPER_DEPTH = 0;
-constexpr const size_t SLEEP_AFTER_PROPERTIES_CHANGE_SECONDS = 5;
 
 struct cmp_str
 {
@@ -160,8 +158,7 @@
                 {
                     for (auto& connPair : object.second)
                     {
-                        auto insertPair =
-                            interfaceConnections.insert(connPair.first);
+                        interfaceConnections.insert(connPair.first);
                     }
                 }
             }
@@ -286,6 +283,11 @@
                         }
                         break;
                     }
+                    default:
+                    {
+                        std::cerr << "unexpected dbus probe type "
+                                  << match.second.type_name() << "\n";
+                    }
                 }
             }
             else
@@ -342,12 +344,10 @@
                 case probe_type_codes::FALSE_T:
                 {
                     return false;
-                    break;
                 }
                 case probe_type_codes::TRUE_T:
                 {
                     return true;
-                    break;
                 }
                 case probe_type_codes::MATCH_ONE:
                 {
@@ -367,7 +367,7 @@
                 {
                     if (!std::regex_search(probe, match, command))
                     {
-                        std::cerr << "found probe sytax error " << probe
+                        std::cerr << "found probe syntax error " << probe
                                   << "\n";
                         return false;
                     }
@@ -377,6 +377,10 @@
                                      commandStr) != PASSED_PROBES.end());
                     break;
                 }
+                default:
+                {
+                    break;
+                }
             }
         }
         // look on dbus for object
@@ -384,7 +388,7 @@
         {
             if (!std::regex_search(probe, match, command))
             {
-                std::cerr << "dbus probe sytax error " << probe << "\n";
+                std::cerr << "dbus probe syntax error " << probe << "\n";
                 return false;
             }
             std::string commandStr = *(match.begin() + 1);
@@ -394,7 +398,7 @@
             auto json = nlohmann::json::parse(commandStr, nullptr, false);
             if (json.is_discarded())
             {
-                std::cerr << "dbus command sytax error " << commandStr << "\n";
+                std::cerr << "dbus command syntax error " << commandStr << "\n";
                 return false;
             }
             // we can match any (string, variant) property. (string, string)
@@ -436,9 +440,14 @@
         foundDevs.emplace_back(
             boost::container::flat_map<std::string, BasicVariantType>());
     }
-    if (matchOne && foundDevs.size() > 1)
+    if (matchOne && ret)
     {
-        foundDevs.erase(foundDevs.begin() + 1, foundDevs.end());
+        // match one could match multiple dbus values, which means we don't care
+        // what one we found so we shouldn't be using template replace. return
+        // an empty one
+        foundDevs.clear();
+        foundDevs.emplace_back(
+            boost::container::flat_map<std::string, BasicVariantType>());
     }
     return ret;
 }
@@ -456,9 +465,11 @@
     }
     ~PerformProbe()
     {
-        if (probe(_probeCommand, _foundDevs))
+        std::vector<boost::container::flat_map<std::string, BasicVariantType>>
+            foundDevs;
+        if (probe(_probeCommand, foundDevs))
         {
-            _callback(_foundDevs);
+            _callback(foundDevs);
         }
     }
     void run()
@@ -467,7 +478,6 @@
         boost::container::flat_map<const char*, probe_type_codes,
                                    cmp_str>::const_iterator probeType;
 
-        std::vector<std::string> dbusProbes;
         for (std::string& probe : _probeCommand)
         {
             bool found = false;
@@ -497,8 +507,6 @@
     std::function<void(std::vector<boost::container::flat_map<
                            std::string, BasicVariantType>>&)>
         _callback;
-    std::vector<boost::container::flat_map<std::string, BasicVariantType>>
-        _foundDevs;
 };
 
 // writes output files to persist data
@@ -793,6 +801,11 @@
                 }
                 break;
             }
+            default:
+            {
+                std::cerr << "Unexpected json type in system configuration \n";
+                break;
+            }
         }
     }
     if (permission == sdbusplus::asio::PropertyPermission::readWrite)
@@ -925,7 +938,6 @@
     for (auto& boardPair : newConfiguration.items())
     {
         std::string boardKey = boardPair.key();
-        std::vector<std::string> path;
         std::string jsonPointerPath = "/" + boardKey;
         // loop through newConfiguration, but use values from system
         // configuration to be able to modify via dbus later
@@ -1129,8 +1141,6 @@
 
     boost::replace_all(*strPtr, "$index", std::to_string(foundDeviceIdx));
 
-    std::size_t templateIndex = 0;
-
     for (auto& foundDevicePair : foundDevice)
     {
         std::string templateName = "$" + foundDevicePair.first;
@@ -1311,7 +1321,7 @@
                     PASSED_PROBES.push_back(name);
                     size_t foundDeviceIdx = 0;
 
-                    // insert into configuration temporarly to be able to
+                    // insert into configuration temporarily to be able to
                     // reference ourselves
                     _systemConfiguration[name] = *record;
 
diff --git a/src/FruDevice.cpp b/src/FruDevice.cpp
index 9d0beff..3c42515 100644
--- a/src/FruDevice.cpp
+++ b/src/FruDevice.cpp
@@ -136,8 +136,8 @@
         {
             continue;
         }
-        auto [_, inserted] = foundOffsets.insert(blockData[ii]);
-        if (!inserted)
+        auto inserted = foundOffsets.insert(blockData[ii]);
+        if (!inserted.second)
         {
             return false;
         }
@@ -210,7 +210,7 @@
                 device.insert(device.end(), block_data.begin(),
                               block_data.begin() + 8);
 
-                for (int jj = 1; jj <= FRU_AREAS.size(); jj++)
+                for (size_t jj = 1; jj <= FRU_AREAS.size(); jj++)
                 {
                     auto area_offset = device[jj];
                     if (area_offset != 0)
@@ -392,8 +392,6 @@
         "VERSION",        "SERIAL_NUMBER", "ASSET_TAG",
         "FRU_VERSION_ID", "INFO_AM1",      "INFO_AM2"};
 
-    size_t sum = 0;
-
     if (fruBytes.size() <= 8)
     {
         return false;
@@ -404,7 +402,7 @@
 
     const std::vector<const char*>* fieldData;
 
-    for (auto& area : FRU_AREAS)
+    for (const std::string& area : FRU_AREAS)
     {
         fruAreaOffsetField++;
         if (fruAreaOffsetField >= fruBytes.end())
@@ -495,7 +493,7 @@
                                 .base(),
                             value.end());
 
-                result[std::string(area) + "_" + field] = std::move(value);
+                result[area + "_" + field] = std::move(value);
 
                 fruBytesIter += length;
                 if (fruBytesIter >= fruBytes.end())
@@ -872,8 +870,8 @@
         eventHandler);
 
     int fd = inotify_init();
-    int wd = inotify_add_watch(fd, I2C_DEV_LOCATION,
-                               IN_CREATE | IN_MOVED_TO | IN_DELETE);
+    inotify_add_watch(fd, I2C_DEV_LOCATION,
+                      IN_CREATE | IN_MOVED_TO | IN_DELETE);
     std::array<char, 4096> readBuffer;
     std::string pendingBuffer;
     // monitor for new i2c devices
