diff --git a/extensions/openpower-pels/sbe_ffdc_handler.cpp b/extensions/openpower-pels/sbe_ffdc_handler.cpp
index a36b6cf..9e6a088 100644
--- a/extensions/openpower-pels/sbe_ffdc_handler.cpp
+++ b/extensions/openpower-pels/sbe_ffdc_handler.cpp
@@ -20,8 +20,10 @@
 #include "pel.hpp"
 #include "temporary_file.hpp"
 
+#include <ekb/hwpf/fapi2/include/return_code_defs.H>
 #include <fmt/format.h>
 
+#include <new>
 #include <phosphor-logging/log.hpp>
 
 namespace openpower
@@ -68,11 +70,87 @@
         if ((file.format == UserDataFormat::custom) &&
             (file.subType == sbeFFDCSubType))
         {
-            // TODO Process SBE file.
+            // Process SBE file.
+            parse(file.fd);
         }
     }
 }
 
+void SbeFFDC::parse(int fd)
+{
+    log<level::INFO>(
+        fmt::format("SBE FFDC file fd:({}), parsing started", fd).c_str());
+
+    uint32_t ffdcBufOffset = 0;
+    uint32_t pktCount = 0;
+    sbeFfdcPacketType ffdcPkt;
+
+    // get SBE FFDC data.
+    auto ffdcData = util::readFD(fd);
+    if (ffdcData.empty())
+    {
+        log<level::ERR>(
+            fmt::format("Empty SBE FFDC file fd:({}), skipping", fd).c_str());
+        return;
+    }
+
+    while ((ffdcBufOffset < ffdcData.size()) && (sbeMaxFfdcPackets != pktCount))
+    {
+        // Next un-extracted FFDC Packet
+        fapiFfdcBufType* ffdc =
+            reinterpret_cast<fapiFfdcBufType*>(ffdcData.data() + ffdcBufOffset);
+        auto magicBytes = ntohs(ffdc->magic_bytes);
+        auto lenWords = ntohs(ffdc->lengthinWords);
+        auto fapiRc = ntohl(ffdc->fapiRc);
+
+        auto msg = fmt::format("FFDC magic: {} length in words:{} Fapirc:{}",
+                               magicBytes, lenWords, fapiRc);
+        log<level::INFO>(msg.c_str());
+
+        if (magicBytes != ffdcMagicCode)
+        {
+            log<level::ERR>("Invalid FFDC magic code in Header: Skipping ");
+            return;
+        }
+        ffdcPkt.fapiRc = fapiRc;
+        // Not interested in the first 2 words (these are not ffdc)
+        auto pktLenWords = lenWords - (2 * ffdcPkgOneWord);
+        ffdcPkt.ffdcLengthInWords = pktLenWords;
+        if (pktLenWords)
+        {
+            // Memory freeing will be taking care by ffdcPkt structure
+            // destructor
+            ffdcPkt.ffdcData = new uint32_t[pktLenWords];
+            memcpy(ffdcPkt.ffdcData,
+                   ((reinterpret_cast<uint32_t*>(ffdc)) +
+                    (2 * ffdcPkgOneWord)), // skip first 2 words
+                   (pktLenWords * sizeof(uint32_t)));
+        }
+        else
+        {
+            log<level::ERR>("FFDC packet size is zero skipping");
+            return;
+        }
+
+        // SBE FFDC processing is not required for SBE Plat errors RCs.
+        // Plat errors processing is driven by SBE provided user data
+        // plugins, which need to link with PEL tool infrastructure.
+        if (ffdcPkt.fapiRc != fapi2::FAPI2_RC_PLAT_ERR_SEE_DATA)
+        {
+            process(ffdcPkt);
+        }
+        ffdcBufOffset += ffdc->lengthinWords;
+        ++pktCount;
+    }
+    if (pktCount == sbeMaxFfdcPackets)
+    {
+        log<level::ERR>(fmt::format("Received more than the limit of ({})"
+                                    " FFDC packets, processing only ({})",
+                                    sbeMaxFfdcPackets, pktCount)
+                            .c_str());
+    }
+}
+
 void SbeFFDC::process(const sbeFfdcPacketType& ffdcPkt)
 {
     using json = nlohmann::json;
