diff --git a/vpd-manager/include/utility/dbus_utility.hpp b/vpd-manager/include/utility/dbus_utility.hpp
index d13e123..344a637 100644
--- a/vpd-manager/include/utility/dbus_utility.hpp
+++ b/vpd-manager/include/utility/dbus_utility.hpp
@@ -1,6 +1,7 @@
 #pragma once
 
 #include "constants.hpp"
+#include "exceptions.hpp"
 #include "logger.hpp"
 #include "types.hpp"
 
@@ -607,5 +608,82 @@
 
     return *l_imValue;
 }
+
+/**
+ * @brief API to return prefix of functional firmware image.
+ *
+ * Every functional image belongs to a series which is denoted by the first two
+ * characters of the image name. The API extracts that and returns it to the
+ * caller.
+ *
+ * @return Two character string, empty string in case of any error.
+ */
+inline std::string getImagePrefix()
+{
+    try
+    {
+        types::DbusVariantType l_retVal = readDbusProperty(
+            constants::objectMapperService, constants::functionalImageObjPath,
+            constants::associationInterface, "endpoints");
+
+        auto l_listOfFunctionalPath =
+            std::get_if<std::vector<std::string>>(&l_retVal);
+
+        if (!l_listOfFunctionalPath || (*l_listOfFunctionalPath).empty())
+        {
+            throw DbusException("failed to get functional image path.");
+        }
+
+        for (const auto& l_imagePath : *l_listOfFunctionalPath)
+        {
+            types::DbusVariantType l_retValPriority =
+                readDbusProperty(constants::imageUpdateService, l_imagePath,
+                                 constants::imagePrirotyInf, "Priority");
+
+            auto l_imagePriority = std::get_if<uint8_t>(&l_retValPriority);
+            if (!l_imagePriority)
+            {
+                throw DbusException(
+                    "failed to read functional image priority for path [" +
+                    l_imagePath + "]");
+            }
+
+            // only interested in running image.
+            if (*l_imagePriority != constants::VALUE_0)
+            {
+                continue;
+            }
+
+            types::DbusVariantType l_retExVer = readDbusProperty(
+                constants::imageUpdateService, l_imagePath,
+                constants::imageExtendedVerInf, "ExtendedVersion");
+
+            auto l_imageExtendedVersion = std::get_if<std::string>(&l_retExVer);
+            if (!l_imageExtendedVersion)
+            {
+                throw DbusException(
+                    "Unable to read extended version for the functional image [" +
+                    l_imagePath + "]");
+            }
+
+            if ((*l_imageExtendedVersion).empty() ||
+                (*l_imageExtendedVersion).length() <= constants::VALUE_2)
+            {
+                throw DbusException("Invalid extended version read for path [" +
+                                    l_imagePath + "]");
+            }
+
+            // return first two character from image name.
+            return (*l_imageExtendedVersion)
+                .substr(constants::VALUE_0, constants::VALUE_2);
+        }
+        throw std::runtime_error("No Image found with required priority.");
+    }
+    catch (const std::exception& l_ex)
+    {
+        logging::logMessage(l_ex.what());
+        return std::string{};
+    }
+}
 } // namespace dbusUtility
 } // namespace vpd
diff --git a/vpd-manager/include/utility/vpd_specific_utility.hpp b/vpd-manager/include/utility/vpd_specific_utility.hpp
index 83db199..4fc553d 100644
--- a/vpd-manager/include/utility/vpd_specific_utility.hpp
+++ b/vpd-manager/include/utility/vpd_specific_utility.hpp
@@ -687,5 +687,45 @@
 
     return l_rc;
 }
+
+/**
+ * @brief API to detect if system configuration is that of PowerVS system.
+ *
+ * @param[in] i_imValue - IM value of the system.
+ * @return true if it is PowerVS configuration, false otherwise.
+ */
+inline bool isPowerVsConfiguration(const types::BinaryVector& i_imValue)
+{
+    if (i_imValue.empty() || i_imValue.size() != constants::VALUE_4)
+    {
+        return false;
+    }
+
+    // Should be a 0x5000XX series system.
+    if (i_imValue.at(0) == constants::HEX_VALUE_50 &&
+        i_imValue.at(1) == constants::HEX_VALUE_00)
+    {
+        std::string l_imagePrefix = dbusUtility::getImagePrefix();
+
+        // Check image for 0x500030XX series.
+        if ((i_imValue.at(2) == constants::HEX_VALUE_30) &&
+            ((l_imagePrefix == constants::powerVsImagePrefix_MY) ||
+             (l_imagePrefix == constants::powerVsImagePrefix_NY)))
+        {
+            logging::logMessage("PowerVS configuration");
+            return true;
+        }
+
+        // Check image for 0X500010XX series.
+        if ((i_imValue.at(2) == constants::HEX_VALUE_10) &&
+            ((l_imagePrefix == constants::powerVsImagePrefix_MZ) ||
+             (l_imagePrefix == constants::powerVsImagePrefix_NZ)))
+        {
+            logging::logMessage("PowerVS configuration");
+            return true;
+        }
+    }
+    return false;
+}
 } // namespace vpdSpecificUtility
 } // namespace vpd
