diff --git a/extensions/openpower-pels/extended_user_data.hpp b/extensions/openpower-pels/extended_user_data.hpp
index 421a6f8..be3db5b 100644
--- a/extensions/openpower-pels/extended_user_data.hpp
+++ b/extensions/openpower-pels/extended_user_data.hpp
@@ -95,6 +95,47 @@
     }
 
     /**
+     * @brief Returns the section data updated with new data
+     *
+     * @param[in] subType - The type of user data
+     * @param[in] componentID - Component ID of the creator
+     * @param[in] newData - The new data
+     *
+     */
+    void updateDataSection(const uint8_t subType, const uint16_t componentId,
+                           const std::vector<uint8_t>& newData)
+    {
+        auto origDataSize = 0;
+
+        if (newData.size() >= 4)
+        {
+            // Update component Id & subtype in section header of ED
+            _header.componentID = static_cast<uint16_t>(componentId);
+            _header.subType = static_cast<uint8_t>(subType);
+
+            if (newData.size() > _data.size())
+            {
+                // Don't allow section to get bigger
+                origDataSize = _data.size();
+                _data = newData;
+                _data.resize(origDataSize);
+            }
+            else
+            {
+                // Use shrink to handle 4B alignment and update the header size
+                auto status =
+                    shrink(Section::flattenedSize() + 4 + newData.size());
+                if (status)
+                {
+                    origDataSize = _data.size();
+                    _data = newData;
+                    _data.resize(origDataSize);
+                }
+            }
+        }
+    }
+
+    /**
      * @brief Get the section contents in JSON
      *
      * @param[in] creatorID - Creator Subsystem ID - unused (see the .cpp)
diff --git a/extensions/openpower-pels/manager.cpp b/extensions/openpower-pels/manager.cpp
index ef7c789..80687a9 100644
--- a/extensions/openpower-pels/manager.cpp
+++ b/extensions/openpower-pels/manager.cpp
@@ -134,6 +134,9 @@
         pel->assignID();
         pel->setCommitTime();
 
+        // Update System Info to Extended User Data
+        pel->updateSysInfoInExtendedUserDataSection(*_dataIface);
+
         try
         {
             log<level::DEBUG>(
diff --git a/extensions/openpower-pels/pel.cpp b/extensions/openpower-pels/pel.cpp
index 48dff51..a3314cd 100644
--- a/extensions/openpower-pels/pel.cpp
+++ b/extensions/openpower-pels/pel.cpp
@@ -493,6 +493,47 @@
     return calloutPresent;
 }
 
+void PEL::updateSysInfoInExtendedUserDataSection(
+    const DataInterfaceBase& dataIface)
+{
+    const AdditionalData additionalData;
+
+    // Check for PEL from Hostboot
+    if (_ph->creatorID() == static_cast<uint8_t>(CreatorID::hostboot))
+    {
+        // Get the ED section from PEL
+        auto op = std::find_if(_optionalSections.begin(),
+                               _optionalSections.end(), [](auto& section) {
+                                   return section->header().id ==
+                                          static_cast<uint16_t>(
+                                              SectionID::extUserData);
+                               });
+
+        // Check for ED section found and its not the last section of PEL
+        if (op != _optionalSections.end())
+        {
+            // Get the extended user data class mapped to found section
+            auto extUserData = static_cast<ExtendedUserData*>(op->get());
+
+            // Check for the creator ID is for OpenBMC
+            if (extUserData->creatorID() ==
+                static_cast<uint8_t>(CreatorID::openBMC))
+            {
+                // Update subtype and component id
+                auto subType = static_cast<uint8_t>(UserDataFormat::json);
+                auto componentId =
+                    static_cast<uint16_t>(ComponentID::phosphorLogging);
+
+                // Update system data to ED section
+                auto ud =
+                    util::makeSysInfoUserDataSection(additionalData, dataIface);
+                extUserData->updateDataSection(subType, componentId,
+                                               ud->data());
+            }
+        }
+    }
+}
+
 namespace util
 {
 
@@ -554,7 +595,10 @@
     {
     }
 
-    json["Process Name"] = std::move(name);
+    if (pid)
+    {
+        json["Process Name"] = std::move(name);
+    }
 }
 
 void addBMCFWVersionIDToJSON(nlohmann::json& json,
diff --git a/extensions/openpower-pels/pel.hpp b/extensions/openpower-pels/pel.hpp
index d48b346..8b592f7 100644
--- a/extensions/openpower-pels/pel.hpp
+++ b/extensions/openpower-pels/pel.hpp
@@ -291,6 +291,15 @@
      */
     bool isCalloutPresent() const;
 
+    /**
+     * @brief Updates the system info data into HB extended user
+     *        data section to this PEL object
+     *
+     * @param[in] dataIface - The data interface object
+     */
+    void updateSysInfoInExtendedUserDataSection(
+        const DataInterfaceBase& dataIface);
+
   private:
     /**
      * @brief Builds the section objects from a PEL data buffer
