diff --git a/include/secureboot.hpp b/include/secureboot.hpp
new file mode 100644
index 0000000..da638b8
--- /dev/null
+++ b/include/secureboot.hpp
@@ -0,0 +1,128 @@
+#pragma once
+
+#include <cereal/access.hpp>
+#include <cereal/cereal.hpp>
+#include <phosphor-logging/lg2.hpp>
+#include <sdbusplus/asio/object_server.hpp>
+#include <sdbusplus/server.hpp>
+#include <xyz/openbmc_project/BIOSConfig/SecureBoot/server.hpp>
+
+#include <filesystem>
+#include <string>
+
+namespace fs = std::filesystem;
+
+namespace bios_config
+{
+static constexpr auto secureBootObjectPath =
+    "/xyz/openbmc_project/bios_config/secure_boot";
+static constexpr auto secureBootPersistFile = "securebootData";
+
+using SecureBootBase =
+    sdbusplus::xyz::openbmc_project::BIOSConfig::server::SecureBoot;
+
+class SecureBoot : public SecureBootBase
+{
+  public:
+    SecureBoot() = delete;
+    ~SecureBoot() = default;
+    SecureBoot(const SecureBoot&) = delete;
+    SecureBoot& operator=(const SecureBoot&) = delete;
+    SecureBoot(SecureBoot&&) = delete;
+    SecureBoot& operator=(SecureBoot&&) = delete;
+
+    /** @brief Constructs SecureBoot object.
+     *
+     *  @param[in] objectServer  - object server
+     *  @param[in] systemBus - bus connection
+     *  @param[in] persistPath - path to the secureboot data file
+     */
+    SecureBoot(sdbusplus::asio::object_server& objectServer,
+               std::shared_ptr<sdbusplus::asio::connection>& systemBus,
+               std::string persistPath);
+
+    /** @brief Indicates the UEFI Secure Boot state during the current boot
+     * cycle
+     *
+     *  @param[in] value - Boot Type during the current cycle
+     *
+     *  @return On success, return the CurrentBootType
+     */
+    CurrentBootType currentBoot(CurrentBootType value) override;
+
+    /** @brief Indicates whether the UEFI Secure Boot takes effect on next boot
+     *
+     *  @param[in] value - new value for the attribute
+     *
+     *  @return On succes, return the new attribute
+     */
+    bool pendingEnable(bool value) override;
+
+    /** @brief Indicates the current UEFI Secure Boot Mode
+     *
+     *  @param[in] value - new value for the attribute
+     *
+     *  @return On success, return the new attribute
+     */
+    ModeType mode(ModeType value) override;
+
+  private:
+    sdbusplus::asio::object_server& objServer;
+    std::shared_ptr<sdbusplus::asio::connection>& systemBus;
+    std::filesystem::path secureBootFile;
+
+    friend class cereal::access;
+
+    /** @brief Save the SecureBoot object to the persistent storage
+     *
+     *  @param[in] archive - archive
+     *  @param[in] version - version
+     */
+    template <class Archive>
+    void save(Archive& archive, const std::uint32_t version) const
+    {
+        // version is not used currently
+        lg2::error("Save is called with version {VER}", "VER", version);
+        archive(sdbusplus::xyz::openbmc_project::BIOSConfig::server::
+                    SecureBoot::currentBoot(),
+                sdbusplus::xyz::openbmc_project::BIOSConfig::server::
+                    SecureBoot::pendingEnable(),
+                sdbusplus::xyz::openbmc_project::BIOSConfig::server::
+                    SecureBoot::mode());
+    }
+
+    /** @brief Load the SecureBoot object from the persistent storage
+     *
+     *  @param[in] archive - archive
+     *  @param[in] version - version
+     */
+    template <class Archive>
+    void load(Archive& archive, const std::uint32_t version)
+    {
+        (void)(version);
+        SecureBoot::CurrentBootType currentBootValue =
+            SecureBoot::CurrentBootType::Unknown;
+        bool enableValue = false;
+        SecureBoot::ModeType modeValue = SecureBoot::ModeType::Unknown;
+
+        archive(currentBootValue, enableValue, modeValue);
+        sdbusplus::xyz::openbmc_project::BIOSConfig::server::SecureBoot::
+            currentBoot(currentBootValue, true);
+        sdbusplus::xyz::openbmc_project::BIOSConfig::server::SecureBoot::
+            pendingEnable(enableValue, true);
+        sdbusplus::xyz::openbmc_project::BIOSConfig::server::SecureBoot::mode(
+            modeValue, true);
+    }
+
+    /** @brief Serialize the SecureBoot object to the persistent storage
+     */
+    void serialize();
+
+    /** @brief Deserialize the SecureBoot object from the persistent storage
+     *
+     *  @return On success, return true
+     *  @return On failure, return false
+     */
+    bool deserialize();
+};
+} // namespace bios_config
