diff --git a/fault-monitor/fru-fault-monitor.cpp b/fault-monitor/fru-fault-monitor.cpp
index e6b6a61..6cb5b8a 100644
--- a/fault-monitor/fru-fault-monitor.cpp
+++ b/fault-monitor/fru-fault-monitor.cpp
@@ -164,11 +164,6 @@
     }
 
     auto& assocs = std::get<AssociationList>(attr->second);
-    if (assocs.empty())
-    {
-        // No associations skip
-        return;
-    }
 
     for (const auto& item : assocs)
     {
@@ -244,11 +239,6 @@
             continue;
         }
         auto& assocs = std::get<AssociationList>(assoc);
-        if (assocs.empty())
-        {
-            // no associations, skip
-            continue;
-        }
 
         for (const auto& item : assocs)
         {
diff --git a/manager/manager.cpp b/manager/manager.cpp
index 6d223b8..5a4c0ef 100644
--- a/manager/manager.cpp
+++ b/manager/manager.cpp
@@ -61,18 +61,15 @@
                             ledLess);
 
         // Remove the elements from Current that are being DeAsserted.
-        if (ledsDeAssert.size())
+        // Power off LEDs that are to be really DeAsserted
+        for (auto& it : ledsDeAssert)
         {
-            // Power off LEDs that are to be really DeAsserted
-            for (auto& it : ledsDeAssert)
+            // Update LEDs in "physically asserted" set by removing those
+            // LEDs which are De-Asserted
+            auto found = currentState.find(it);
+            if (found != currentState.end())
             {
-                // Update LEDs in "physically asserted" set by removing those
-                // LEDs which are De-Asserted
-                auto found = currentState.find(it);
-                if (found != currentState.end())
-                {
-                    currentState.erase(found);
-                }
+                currentState.erase(found);
             }
         }
     }
@@ -208,32 +205,26 @@
     ActionSet failedLedsDeAssert;
 
     // This order of LED operation is important.
-    if (reqLedsDeAssert.size())
+    for (const auto& it : reqLedsDeAssert)
     {
-        for (const auto& it : reqLedsDeAssert)
+        std::string objPath = std::string(phyLedPath) + it.name;
+        lg2::debug("De-Asserting LED, NAME = {NAME}, ACTION = {ACTION}", "NAME",
+                   it.name, "ACTION", it.action);
+        if (drivePhysicalLED(objPath, Layout::Action::Off, it.dutyOn,
+                             it.period))
         {
-            std::string objPath = std::string(phyLedPath) + it.name;
-            lg2::debug("De-Asserting LED, NAME = {NAME}, ACTION = {ACTION}",
-                       "NAME", it.name, "ACTION", it.action);
-            if (drivePhysicalLED(objPath, Layout::Action::Off, it.dutyOn,
-                                 it.period))
-            {
-                failedLedsDeAssert.insert(it);
-            }
+            failedLedsDeAssert.insert(it);
         }
     }
 
-    if (reqLedsAssert.size())
+    for (const auto& it : reqLedsAssert)
     {
-        for (const auto& it : reqLedsAssert)
+        std::string objPath = std::string(phyLedPath) + it.name;
+        lg2::debug("Asserting LED, NAME = {NAME}, ACTION = {ACTION}", "NAME",
+                   it.name, "ACTION", it.action);
+        if (drivePhysicalLED(objPath, it.action, it.dutyOn, it.period))
         {
-            std::string objPath = std::string(phyLedPath) + it.name;
-            lg2::debug("Asserting LED, NAME = {NAME}, ACTION = {ACTION}",
-                       "NAME", it.name, "ACTION", it.action);
-            if (drivePhysicalLED(objPath, it.action, it.dutyOn, it.period))
-            {
-                failedLedsAssert.insert(it);
-            }
+            failedLedsAssert.insert(it);
         }
     }
 
