diff --git a/vpd-manager/include/single_fab.hpp b/vpd-manager/include/single_fab.hpp
index c5623c4..5e4fb76 100644
--- a/vpd-manager/include/single_fab.hpp
+++ b/vpd-manager/include/single_fab.hpp
@@ -1,5 +1,8 @@
 #pragma once
 
+#include "constants.hpp"
+#include "event_logger.hpp"
+
 #include <string>
 
 namespace vpd
@@ -12,8 +15,20 @@
  */
 class SingleFab
 {
-    // ToDo: public API to be implemented, which can be called by the user to
-    // support single FAB.
+  public:
+    /**
+     * @brief API to support single FAB feature.
+     *
+     * This API updates the IM value to the P11 series or creates PEL in invalid
+     * case based on the IM value read from the cache and planar, considering
+     * the system mode and image.
+     *
+     * System mode can be of field mode or lab mode and system image can be
+     * special or normal image.
+     *
+     * @return 0 on success, -1 in case of failure.
+     */
+    int singleFabImOverride() const noexcept;
 
   private:
     /**
@@ -50,10 +65,80 @@
      * @brief API to update IM value on system planar EEPROM path to P11 series.
      *
      * @param[in] i_currentImValuePlanar - current IM value in planar EEPROM.
-     *
-     * @return true if IM value is updated successfully, otherwise false.
      */
-    bool updateSystemImValueInVpdToP11Series(
+    void updateSystemImValueInVpdToP11Series(
         std::string i_currentImValuePlanar) const noexcept;
+
+    /**
+     * @brief API to check if it is a P10 system.
+     *
+     * @param[in] i_imValue - IM value of the system.
+     *
+     * @return true, if P10 system. Otherwise false.
+     */
+    inline bool isP10System(const std::string& i_imValue) const noexcept
+    {
+        try
+        {
+            return !(i_imValue.compare(constants::VALUE_0, constants::VALUE_4,
+                                       POWER10_IM_SERIES));
+        }
+        catch (const std::exception& l_ex)
+        {
+            EventLogger::createSyncPel(
+                types::ErrorType::InternalFailure,
+                types::SeverityType::Informational, __FILE__, __FUNCTION__, 0,
+                std::string(
+                    "Failed to check if system is of P10 series. Error : ") +
+                    l_ex.what(),
+                std::nullopt, std::nullopt, std::nullopt, std::nullopt);
+            return false;
+        }
+    }
+
+    /**
+     * @brief API to check if it is a P11 system.
+     *
+     * @param[in] i_imValue - IM value of the system.
+     *
+     * @return true, if P11 system. Otherwise false.
+     */
+    inline bool isP11System(const std::string& i_imValue) const noexcept
+    {
+        try
+        {
+            return !(i_imValue.compare(constants::VALUE_0, constants::VALUE_4,
+                                       POWER11_IM_SERIES));
+        }
+        catch (const std::exception& l_ex)
+        {
+            EventLogger::createSyncPel(
+                types::ErrorType::InternalFailure,
+                types::SeverityType::Informational, __FILE__, __FUNCTION__, 0,
+                std::string(
+                    "Failed to check if system is of P11 series. Error : ") +
+                    l_ex.what(),
+                std::nullopt, std::nullopt, std::nullopt, std::nullopt);
+            return false;
+        }
+    }
+
+    /**
+     * @brief API to check if it is a valid IM series.
+     *
+     * This API checks if the provided IM value is of either P10 or P11 series.
+     *
+     * @param[in] i_imValue - IM value of the system.
+     *
+     * @return true, if valid IM series. Otherwise false.
+     */
+    inline bool isValidImSeries(const std::string& l_imValue) const noexcept
+    {
+        return (isP10System(l_imValue) || isP11System(l_imValue));
+    }
+
+    // valid IM series.
+    static constexpr auto POWER10_IM_SERIES = "5000";
+    static constexpr auto POWER11_IM_SERIES = "6000";
 };
 } // namespace vpd
