diff --git a/src/PSUEvent.cpp b/src/PSUEvent.cpp
index b75a494..8980d53 100644
--- a/src/PSUEvent.cpp
+++ b/src/PSUEvent.cpp
@@ -52,12 +52,13 @@
         std::make_shared<std::set<std::string>>();
     for (const auto& pathList : eventPathList)
     {
+        std::shared_ptr<std::set<std::string>> assert =
+            std::make_shared<std::set<std::string>>();
+
         const std::string& eventName = pathList.first;
         std::string eventPSUName = eventName + psuName;
         for (const auto& path : pathList.second)
         {
-            std::shared_ptr<std::set<std::string>> assert =
-                std::make_shared<std::set<std::string>>();
             std::shared_ptr<bool> state = std::make_shared<bool>(false);
             events[eventPSUName].emplace_back(std::make_unique<PSUSubEvent>(
                 eventInterface, path, io, eventName, assert, combineEvent,
@@ -207,15 +208,16 @@
 {
     if (newValue == 0)
     {
-        auto found = (*asserts).find(path);
-        if (found == (*asserts).end())
-        {
-            return;
-        }
-        (*asserts).erase(path);
-
+        // log deassert only after all asserts are gone
         if (!(*asserts).empty())
         {
+            auto found = (*asserts).find(path);
+            if (found == (*asserts).end())
+            {
+                return;
+            }
+            (*asserts).erase(path);
+
             return;
         }
         if (*assertState == true)
@@ -224,7 +226,6 @@
             auto foundCombine = (*combineEvent).find(eventName);
             if (foundCombine == (*combineEvent).end())
             {
-                value = newValue;
                 return;
             }
             (*combineEvent).erase(eventName);
@@ -236,7 +237,7 @@
                 {
                     sd_journal_send(
                         "MESSAGE=%s", sendMessage.c_str(), "PRIORITY=%i",
-                        LOG_ERR, "REDFISH_MESSAGE_ID=%s",
+                        LOG_INFO, "REDFISH_MESSAGE_ID=%s",
                         deassertMessage.c_str(), "REDFISH_MESSAGE_ARGS=%s,%s",
                         psuName.c_str(), fanName.c_str(), NULL);
                 }
@@ -244,7 +245,7 @@
                 {
                     sd_journal_send(
                         "MESSAGE=%s", sendMessage.c_str(), "PRIORITY=%i",
-                        LOG_ERR, "REDFISH_MESSAGE_ID=%s",
+                        LOG_INFO, "REDFISH_MESSAGE_ID=%s",
                         deassertMessage.c_str(), "REDFISH_MESSAGE_ARGS=%s",
                         psuName.c_str(), NULL);
                 }
@@ -258,16 +259,9 @@
     }
     else
     {
-        (*asserts).emplace(path);
-        if (*assertState == false)
+        if ((*assertState == false) && ((*asserts).empty()))
         {
             *assertState = true;
-            auto foundCombine = (*combineEvent).find(eventName);
-            if (foundCombine != (*combineEvent).end())
-            {
-                value = newValue;
-                return;
-            }
             if (!assertMessage.empty())
             {
                 // Fan Failed has two args
@@ -276,16 +270,17 @@
                 {
                     sd_journal_send(
                         "MESSAGE=%s", sendMessage.c_str(), "PRIORITY=%i",
-                        LOG_ERR, "REDFISH_MESSAGE_ID=%s", assertMessage.c_str(),
-                        "REDFISH_MESSAGE_ARGS=%s,%s", psuName.c_str(),
-                        fanName.c_str(), NULL);
+                        LOG_WARNING, "REDFISH_MESSAGE_ID=%s",
+                        assertMessage.c_str(), "REDFISH_MESSAGE_ARGS=%s,%s",
+                        psuName.c_str(), fanName.c_str(), NULL);
                 }
                 else
                 {
                     sd_journal_send(
                         "MESSAGE=%s", sendMessage.c_str(), "PRIORITY=%i",
-                        LOG_ERR, "REDFISH_MESSAGE_ID=%s", assertMessage.c_str(),
-                        "REDFISH_MESSAGE_ARGS=%s", psuName.c_str(), NULL);
+                        LOG_WARNING, "REDFISH_MESSAGE_ID=%s",
+                        assertMessage.c_str(), "REDFISH_MESSAGE_ARGS=%s",
+                        psuName.c_str(), NULL);
                 }
             }
             if ((*combineEvent).empty())
@@ -294,6 +289,7 @@
             }
             (*combineEvent).emplace(eventName);
         }
+        (*asserts).emplace(path);
     }
     value = newValue;
 }
