diff --git a/oem/ibm/libpldmresponder/file_io_by_type.cpp b/oem/ibm/libpldmresponder/file_io_by_type.cpp
index fd0144e..9bd5e74 100644
--- a/oem/ibm/libpldmresponder/file_io_by_type.cpp
+++ b/oem/ibm/libpldmresponder/file_io_by_type.cpp
@@ -10,6 +10,7 @@
 #include "file_io_type_dump.hpp"
 #include "file_io_type_lid.hpp"
 #include "file_io_type_pel.hpp"
+#include "file_io_type_progress_src.hpp"
 #include "xyz/openbmc_project/Common/error.hpp"
 
 #include <stdint.h>
@@ -156,6 +157,10 @@
         {
             return std::make_unique<CertHandler>(fileHandle, fileType);
         }
+        case PLDM_FILE_TYPE_PROGRESS_SRC:
+        {
+            return std::make_unique<ProgressCodeHandler>(fileHandle);
+        }
         default:
         {
             throw InternalFailure();
diff --git a/oem/ibm/libpldmresponder/file_io_type_progress_src.cpp b/oem/ibm/libpldmresponder/file_io_type_progress_src.cpp
new file mode 100644
index 0000000..3d51039
--- /dev/null
+++ b/oem/ibm/libpldmresponder/file_io_type_progress_src.cpp
@@ -0,0 +1,79 @@
+#include "file_io_type_progress_src.hpp"
+
+#include "common/utils.hpp"
+
+#include <iostream>
+
+namespace pldm
+{
+
+namespace responder
+{
+
+int ProgressCodeHandler::setRawBootProperty(
+    const std::tuple<uint64_t, std::vector<uint8_t>>& progressCodeBuffer)
+{
+    static constexpr auto RawObjectPath =
+        "/xyz/openbmc_project/state/boot/raw0";
+    static constexpr auto RawInterface = "xyz.openbmc_project.State.Boot.Raw";
+    static constexpr auto FreedesktopInterface =
+        "org.freedesktop.DBus.Properties";
+    static constexpr auto RawProperty = "Value";
+    static constexpr auto SetMethod = "Set";
+
+    auto& bus = pldm::utils::DBusHandler::getBus();
+
+    try
+    {
+        auto service =
+            pldm::utils::DBusHandler().getService(RawObjectPath, RawInterface);
+        auto method = bus.new_method_call(service.c_str(), RawObjectPath,
+                                          FreedesktopInterface, SetMethod);
+        method.append(RawInterface, RawProperty,
+                      std::variant<std::tuple<uint64_t, std::vector<uint8_t>>>(
+                          progressCodeBuffer));
+
+        bus.call_noreply(method);
+    }
+    catch (const std::exception& e)
+    {
+        std::cerr << "failed to make a d-bus call to host-postd daemon, ERROR="
+                  << e.what() << "\n";
+        return PLDM_ERROR;
+    }
+
+    return PLDM_SUCCESS;
+}
+
+int ProgressCodeHandler::write(const char* buffer, uint32_t /*offset*/,
+                               uint32_t& length,
+                               oem_platform::Handler* /*oemPlatformHandler*/)
+{
+    static constexpr auto StartOffset = 40;
+    static constexpr auto EndOffset = 48;
+    if (buffer != nullptr)
+    {
+        // read the data from the pointed location
+        std::vector<uint8_t> secondaryCode(buffer, buffer + length);
+
+        // Get the primary code from the offset 40 bytes in the received buffer
+
+        std::vector<uint8_t> primaryCodeArray(
+            secondaryCode.begin() + StartOffset,
+            secondaryCode.begin() + EndOffset);
+        uint64_t primaryCode = 0;
+
+        // form a uint64_t using uint8_t[8]
+        for (int i = 0; i < 8; i++)
+            primaryCode |= (uint64_t)primaryCodeArray[i] << 8 * i;
+
+        std::cout << "Primary Progress Code in Hex : " << std::hex
+                  << primaryCode << std::endl;
+
+        return setRawBootProperty(std::make_tuple(primaryCode, secondaryCode));
+    }
+    return PLDM_ERROR;
+}
+
+} // namespace responder
+} // namespace pldm
diff --git a/oem/ibm/libpldmresponder/file_io_type_progress_src.hpp b/oem/ibm/libpldmresponder/file_io_type_progress_src.hpp
new file mode 100644
index 0000000..a223f1a
--- /dev/null
+++ b/oem/ibm/libpldmresponder/file_io_type_progress_src.hpp
@@ -0,0 +1,73 @@
+#pragma once
+
+#include "file_io_by_type.hpp"
+
+namespace pldm
+{
+
+namespace responder
+{
+
+/** @class ProgressCodeHandler
+ *
+ * @brief Inherits and implemented FileHandler. This class is used
+ * to read the Progress SRC's from the Host.
+ */
+class ProgressCodeHandler : public FileHandler
+{
+  public:
+    /** @brief ProgressCodeHandler constructor
+     */
+    ProgressCodeHandler(uint32_t fileHandle) : FileHandler(fileHandle)
+    {}
+
+    int writeFromMemory(uint32_t /*offset*/, uint32_t /*length*/,
+                        uint64_t /*address*/,
+                        oem_platform::Handler* /*oemPlatformHandler*/) override
+    {
+        return PLDM_ERROR_UNSUPPORTED_PLDM_CMD;
+    }
+
+    int write(const char* buffer, uint32_t offset, uint32_t& length,
+              oem_platform::Handler* oemPlatformHandler) override;
+
+    int readIntoMemory(uint32_t /*offset*/, uint32_t& /*length*/,
+                       uint64_t /*address*/,
+                       oem_platform::Handler* /*oemPlatformHandler*/) override
+    {
+        return PLDM_ERROR_UNSUPPORTED_PLDM_CMD;
+    }
+
+    int read(uint32_t /*offset*/, uint32_t& /*length*/, Response& /*response*/,
+             oem_platform::Handler* /*oemPlatformHandler*/) override
+    {
+        return PLDM_ERROR_UNSUPPORTED_PLDM_CMD;
+    }
+
+    int fileAck(uint8_t /*fileStatus*/) override
+    {
+        return PLDM_ERROR_UNSUPPORTED_PLDM_CMD;
+    }
+
+    int newFileAvailable(uint64_t /*length*/) override
+    {
+        return PLDM_ERROR_UNSUPPORTED_PLDM_CMD;
+    }
+
+    /** @brief method to set the dbus Raw value Property with
+     * the obtained progress code from the host.
+     *
+     *  @param[in] progressCodeBuffer - the progress Code SRC Buffer
+     */
+    virtual int setRawBootProperty(
+        const std::tuple<uint64_t, std::vector<uint8_t>>& progressCodeBuffer);
+
+    /** @brief ProgressCodeHandler destructor
+     */
+
+    ~ProgressCodeHandler()
+    {}
+};
+
+} // namespace responder
+} // namespace pldm
