diff --git a/include/EntityManager.hpp b/include/EntityManager.hpp
index 7f46ce2..74ba827 100644
--- a/include/EntityManager.hpp
+++ b/include/EntityManager.hpp
@@ -19,20 +19,74 @@
 #include <systemd/sd-journal.h>
 
 #include <iostream>
+#include <nlohmann/json.hpp>
 #include <string>
 
-inline void logDeviceAdded(const std::string& device)
+inline void logDeviceAdded(const nlohmann::json& record)
 {
 
+    auto findType = record.find("Type");
+    auto findAsset =
+        record.find("xyz.openbmc_project.Inventory.Decorator.Asset");
+
+    std::string model = "Unkown";
+    std::string type = "Unknown";
+    std::string sn = "Unkown";
+
+    if (findType != record.end())
+    {
+        type = findType->get<std::string>();
+    }
+    if (findAsset != record.end())
+    {
+        auto findModel = findAsset->find("Model");
+        auto findSn = findAsset->find("SerialNumber");
+        if (findModel != findAsset->end())
+        {
+            model = findModel->get<std::string>();
+        }
+        if (findSn != findAsset->end())
+        {
+            sn = findSn->get<std::string>();
+        }
+    }
+
     sd_journal_send("MESSAGE=%s", "Inventory Added", "PRIORITY=%i", LOG_ERR,
                     "REDFISH_MESSAGE_ID=%s", "OpenBMC.0.1.InventoryAdded",
-                    "REDFISH_MESSAGE_ARGS=%s", device.c_str(), NULL);
+                    "REDFISH_MESSAGE_ARGS=%s,%s,%s", model.c_str(),
+                    type.c_str(), sn.c_str(), NULL);
 }
 
-inline void logDeviceRemoved(const std::string& device)
+inline void logDeviceRemoved(const nlohmann::json& record)
 {
+    auto findType = record.find("Type");
+    auto findAsset =
+        record.find("xyz.openbmc_project.Inventory.Decorator.Asset");
+
+    std::string model = "Unkown";
+    std::string type = "Unknown";
+    std::string sn = "Unkown";
+
+    if (findType != record.end())
+    {
+        type = findType->get<std::string>();
+    }
+    if (findAsset != record.end())
+    {
+        auto findModel = findAsset->find("Model");
+        auto findSn = findAsset->find("SerialNumber");
+        if (findModel != findAsset->end())
+        {
+            model = findModel->get<std::string>();
+        }
+        if (findSn != findAsset->end())
+        {
+            sn = findSn->get<std::string>();
+        }
+    }
 
     sd_journal_send("MESSAGE=%s", "Inventory Removed", "PRIORITY=%i", LOG_ERR,
                     "REDFISH_MESSAGE_ID=%s", "OpenBMC.0.1.InventoryRemoved",
-                    "REDFISH_MESSAGE_ARGS=%s", device.c_str(), NULL);
+                    "REDFISH_MESSAGE_ARGS=%s,%s,%s", model.c_str(),
+                    type.c_str(), sn.c_str(), NULL);
 }
\ No newline at end of file
diff --git a/src/EntityManager.cpp b/src/EntityManager.cpp
index bd8ccc7..da940b3 100644
--- a/src/EntityManager.cpp
+++ b/src/EntityManager.cpp
@@ -1471,7 +1471,8 @@
                         }
                         // overwrite ourselves with cleaned up version
                         _systemConfiguration[recordName] = record;
-                        logDeviceAdded(record.at("Name").get<std::string>());
+
+                        logDeviceAdded(record);
 
                         foundDeviceIdx++;
                     }
@@ -1520,53 +1521,53 @@
     }
 
     timer.expires_from_now(boost::posix_time::seconds(10));
-    timer.async_wait([&systemConfiguration](
-                         const boost::system::error_code& ec) {
-        if (ec == boost::asio::error::operation_aborted)
-        {
-            // we were cancelled
-            return;
-        }
-
-        bool powerOff = !isPowerOn();
-        for (const auto& item : lastJson.items())
-        {
-            if (systemConfiguration.find(item.key()) ==
-                systemConfiguration.end())
+    timer.async_wait(
+        [&systemConfiguration](const boost::system::error_code& ec) {
+            if (ec == boost::asio::error::operation_aborted)
             {
-                bool isDetectedPowerOn = false;
-                auto powerState = item.value().find("PowerState");
-                if (powerState != item.value().end())
+                // we were cancelled
+                return;
+            }
+
+            bool powerOff = !isPowerOn();
+            for (const auto& item : lastJson.items())
+            {
+                if (systemConfiguration.find(item.key()) ==
+                    systemConfiguration.end())
                 {
-                    auto ptr = powerState->get_ptr<const std::string*>();
-                    if (ptr)
+                    bool isDetectedPowerOn = false;
+                    auto powerState = item.value().find("PowerState");
+                    if (powerState != item.value().end())
                     {
-                        if (*ptr == "On" || *ptr == "BiosPost")
+                        auto ptr = powerState->get_ptr<const std::string*>();
+                        if (ptr)
                         {
-                            isDetectedPowerOn = true;
+                            if (*ptr == "On" || *ptr == "BiosPost")
+                            {
+                                isDetectedPowerOn = true;
+                            }
                         }
                     }
-                }
-                if (powerOff && isDetectedPowerOn)
-                {
-                    // power not on yet, don't know if it's there or not
-                    continue;
-                }
-                if (!powerOff && scannedPowerOff && isDetectedPowerOn)
-                {
-                    // already logged it when power was off
-                    continue;
-                }
+                    if (powerOff && isDetectedPowerOn)
+                    {
+                        // power not on yet, don't know if it's there or not
+                        continue;
+                    }
+                    if (!powerOff && scannedPowerOff && isDetectedPowerOn)
+                    {
+                        // already logged it when power was off
+                        continue;
+                    }
 
-                logDeviceRemoved(item.value().at("Name").get<std::string>());
+                    logDeviceRemoved(item.value());
+                }
             }
-        }
-        scannedPowerOff = true;
-        if (!powerOff)
-        {
-            scannedPowerOn = true;
-        }
-    });
+            scannedPowerOff = true;
+            if (!powerOff)
+            {
+                scannedPowerOn = true;
+            }
+        });
 }
 
 // main properties changed entry
