diff --git a/src/appcommands.cpp b/src/appcommands.cpp
index 539d119..485422d 100644
--- a/src/appcommands.cpp
+++ b/src/appcommands.cpp
@@ -13,7 +13,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 */
-#include "xyz/openbmc_project/Common/error.hpp"
+#include <byteswap.h>
 
 #include <appcommands.hpp>
 #include <fstream>
@@ -22,8 +22,6 @@
 #include <nlohmann/json.hpp>
 #include <phosphor-logging/log.hpp>
 #include <regex>
-#include <xyz/openbmc_project/Software/Activation/server.hpp>
-#include <xyz/openbmc_project/Software/Version/server.hpp>
 #include <xyz/openbmc_project/State/BMC/server.hpp>
 
 namespace ipmi
@@ -31,23 +29,20 @@
 
 static void registerAPPFunctions() __attribute__((constructor));
 
-namespace Log = phosphor::logging;
-namespace Error = sdbusplus::xyz::openbmc_project::Common::Error;
-using Version = sdbusplus::xyz::openbmc_project::Software::server::Version;
-using Activation =
-    sdbusplus::xyz::openbmc_project::Software::server::Activation;
-using BMC = sdbusplus::xyz::openbmc_project::State::server::BMC;
+static constexpr const char* bmcStateIntf = "xyz.openbmc_project.State.BMC";
+static constexpr const char* softwareVerIntf =
+    "xyz.openbmc_project.Software.Version";
+static constexpr const char* softwareActivationIntf =
+    "xyz.openbmc_project.Software.Activation";
+static constexpr const char* associationIntf =
+    "xyz.openbmc_project.Association";
+static constexpr const char* softwareFunctionalPath =
+    "/xyz/openbmc_project/software/functional";
 
+using BMC = sdbusplus::xyz::openbmc_project::State::server::BMC;
 constexpr auto bmc_state_interface = "xyz.openbmc_project.State.BMC";
 constexpr auto bmc_state_property = "CurrentBMCState";
 
-static constexpr auto redundancyIntf =
-    "xyz.openbmc_project.Software.RedundancyPriority";
-static constexpr auto versionIntf = "xyz.openbmc_project.Software.Version";
-static constexpr auto activationIntf =
-    "xyz.openbmc_project.Software.Activation";
-static constexpr auto softwareRoot = "/xyz/openbmc_project/software";
-
 bool getCurrentBmcState()
 {
     sdbusplus::bus::bus bus{ipmid_get_sd_bus_connection()};
@@ -79,85 +74,80 @@
 }
 
 /**
- * @brief Returns the Version info from primary software object
+ * @brief Returns the functional firmware version information.
  *
- * Get the Version info from the active s/w object which is having high
- * "Priority" value(a smaller number is a higher priority) and "Purpose"
- * is "BMC" from the list of all s/w objects those are implementing
- * RedundancyPriority interface from the given softwareRoot path.
+ * It reads the active firmware versions by checking functional
+ * endpoints association and matching the input version purpose string.
+ * ctx[in]                - ipmi context.
+ * reqVersionPurpose[in]  - Version purpose which need to be read.
+ * version[out]           - Output Version string.
  *
- * @return On success returns the Version info from primary software object.
+ * @return Returns '0' on success and '-1' on failure.
  *
  */
-std::string getActiveSoftwareVersionInfo()
+int getActiveSoftwareVersionInfo(ipmi::Context::ptr ctx,
+                                 const std::string& reqVersionPurpose,
+                                 std::string& version)
 {
-    auto busp = getSdBus();
-
-    std::string revision{};
-    ipmi::ObjectTree objectTree;
-    try
+    std::vector<std::string> activeEndPoints;
+    boost::system::error_code ec = ipmi::getDbusProperty(
+        ctx, ipmi::MAPPER_BUS_NAME, softwareFunctionalPath, associationIntf,
+        "endpoints", activeEndPoints);
+    if (ec)
     {
-        objectTree =
-            ipmi::getAllDbusObjects(*busp, softwareRoot, redundancyIntf);
-    }
-    catch (sdbusplus::exception::SdBusError& e)
-    {
-        Log::log<Log::level::ERR>("Failed to fetch redundancy object from dbus",
-                                  Log::entry("INTERFACE=%s", redundancyIntf),
-                                  Log::entry("ERRMSG=%s", e.what()));
+        phosphor::logging::log<phosphor::logging::level::ERR>(
+            "Failed to get Active firmware version endpoints.");
+        return -1;
     }
 
-    auto objectFound = false;
-    for (auto& softObject : objectTree)
+    for (auto& activeEndPoint : activeEndPoints)
     {
-        auto service =
-            ipmi::getService(*busp, redundancyIntf, softObject.first);
-        auto objValueTree =
-            ipmi::getManagedObjects(*busp, service, softwareRoot);
-
-        auto minPriority = 0xFF;
-        for (const auto& objIter : objValueTree)
+        std::string serviceName;
+        ec = ipmi::getService(ctx, softwareActivationIntf, activeEndPoint,
+                              serviceName);
+        if (ec)
         {
-            try
-            {
-                auto& intfMap = objIter.second;
-                auto& redundancyPriorityProps = intfMap.at(redundancyIntf);
-                auto& versionProps = intfMap.at(versionIntf);
-                auto& activationProps = intfMap.at(activationIntf);
-                auto priority =
-                    std::get<uint8_t>(redundancyPriorityProps.at("Priority"));
-                auto purpose =
-                    std::get<std::string>(versionProps.at("Purpose"));
-                auto activation =
-                    std::get<std::string>(activationProps.at("Activation"));
-                auto version =
-                    std::get<std::string>(versionProps.at("Version"));
-                if ((Version::convertVersionPurposeFromString(purpose) ==
-                     Version::VersionPurpose::BMC) &&
-                    (Activation::convertActivationsFromString(activation) ==
-                     Activation::Activations::Active))
-                {
-                    if (priority < minPriority)
-                    {
-                        minPriority = priority;
-                        objectFound = true;
-                        revision = std::move(version);
-                    }
-                }
-            }
-            catch (const std::exception& e)
-            {
-                Log::log<Log::level::ERR>(e.what());
-            }
+            phosphor::logging::log<phosphor::logging::level::ERR>(
+                "Failed to perform getService.",
+                phosphor::logging::entry("OBJPATH=%s", activeEndPoint.c_str()));
+            continue;
+        }
+
+        PropertyMap propMap;
+        ec = ipmi::getAllDbusProperties(ctx, serviceName, activeEndPoint,
+                                        softwareVerIntf, propMap);
+        if (ec)
+        {
+            phosphor::logging::log<phosphor::logging::level::ERR>(
+                "Failed to perform GetAll on Version interface.",
+                phosphor::logging::entry("SERVICE=%s", serviceName.c_str()),
+                phosphor::logging::entry("PATH=%s", activeEndPoint.c_str()));
+            continue;
+        }
+
+        std::string* purposeProp =
+            std::get_if<std::string>(&propMap["Purpose"]);
+        std::string* versionProp =
+            std::get_if<std::string>(&propMap["Version"]);
+        if (!purposeProp || !versionProp)
+        {
+            phosphor::logging::log<phosphor::logging::level::ERR>(
+                "Failed to get version or purpose property");
+            continue;
+        }
+
+        // Check for requested version information and return if found.
+        if (*purposeProp == reqVersionPurpose)
+        {
+            version = *versionProp;
+            return 0;
         }
     }
 
-    if (!objectFound)
-    {
-        Log::log<Log::level::ERR>("Could not find an BMC software object");
-    }
-
-    return revision;
+    phosphor::logging::log<phosphor::logging::level::INFO>(
+        "Failed to find version information.",
+        phosphor::logging::entry("PURPOSE=%s", reqVersionPurpose.c_str()));
+    return -1;
 }
 
 // Support both 2 solutions:
@@ -194,9 +184,9 @@
                 rev.platform + ":" + std::to_string(rev.major) + ":" +
                 std::to_string(rev.minor) + ":" + std::to_string(rev.buildNo) +
                 ":" + rev.openbmcHash + ":" + rev.metaHash;
-            Log::log<Log::level::INFO>(
+            phosphor::logging::log<phosphor::logging::level::INFO>(
                 "Get BMC version",
-                Log::entry("VERSION=%s", versionString.c_str()));
+                phosphor::logging::entry("VERSION=%s", versionString.c_str()));
             return rev;
         }
     }
@@ -216,9 +206,9 @@
                 rev.platform + ":" + std::to_string(rev.major) + ":" +
                 std::to_string(rev.minor) + ":" + std::to_string(rev.buildNo) +
                 ":" + rev.openbmcHash + ":" + rev.metaHash;
-            Log::log<Log::level::INFO>(
+            phosphor::logging::log<phosphor::logging::level::INFO>(
                 "Get BMC version",
-                Log::entry("VERSION=%s", versionString.c_str()));
+                phosphor::logging::entry("VERSION=%s", versionString.c_str()));
             return rev;
         }
     }
@@ -228,7 +218,8 @@
 
 RspType<uint8_t,  // Device ID
         uint8_t,  // Device Revision
-        uint8_t,  // Firmware Revision Major
+        uint7_t,  // Firmware Revision Major
+        bool,     // Device available(0=NormalMode,1=DeviceFirmware)
         uint8_t,  // Firmware Revision minor
         uint8_t,  // IPMI version
         uint8_t,  // Additional device support
@@ -236,13 +227,15 @@
         uint16_t, // Product ID
         uint32_t  // AUX info
         >
-    ipmiAppGetDeviceId()
+    ipmiAppGetDeviceId(ipmi::Context::ptr ctx)
 {
     static struct
     {
         uint8_t id;
         uint8_t revision;
-        uint8_t fw[2];
+        uint7_t fwMajor;
+        bool devBusy;
+        uint8_t fwMinor;
         uint8_t ipmiVer = 2;
         uint8_t addnDevSupport;
         uint24_t manufId;
@@ -254,50 +247,35 @@
     static bool defaultActivationSetting = false;
     const char* filename = "/usr/share/ipmi-providers/dev_id.json";
     const char* prodIdFilename = "/var/cache/private/prodID";
-    constexpr auto ipmiDevIdStateShift = 7;
-    constexpr auto ipmiDevIdFw1Mask = ~(1 << ipmiDevIdStateShift);
-    constexpr auto ipmiDevIdBusy = (1 << ipmiDevIdStateShift);
-
     if (!fwVerInitialized)
     {
-        std::optional<MetaRevision> rev;
-        try
+        std::string versionString;
+        if (!getActiveSoftwareVersionInfo(ctx, versionPurposeBMC,
+                                          versionString))
         {
-            auto version = getActiveSoftwareVersionInfo();
-            rev = convertIntelVersion(version);
-        }
-        catch (const std::exception& e)
-        {
-            Log::log<Log::level::ERR>("Failed to get active version info",
-                                      Log::entry("ERROR=%s", e.what()));
-        }
-
-        if (rev.has_value())
-        {
-            // bit7 identifies if the device is available
-            // 0=normal operation
-            // 1=device firmware, SDR update,
-            // or self-initialization in progress.
-            // The availability may change in run time, so mask here
-            // and initialize later.
-            MetaRevision revision = rev.value();
-            devId.fw[0] = revision.major & ipmiDevIdFw1Mask;
-
-            revision.minor = (revision.minor > 99 ? 99 : revision.minor);
-            devId.fw[1] = revision.minor % 10 + (revision.minor / 10) * 16;
-            try
+            std::optional<MetaRevision> rev =
+                convertIntelVersion(versionString);
+            if (rev.has_value())
             {
-                uint32_t hash = std::stoul(revision.metaHash, 0, 16);
-                hash = ((hash & 0xff000000) >> 24) |
-                       ((hash & 0x00FF0000) >> 8) | ((hash & 0x0000FF00) << 8) |
-                       ((hash & 0xFF) << 24);
-                devId.aux = (revision.buildNo & 0xFF) + (hash & 0xFFFFFF00);
-                fwVerInitialized = true;
-            }
-            catch (const std::exception& e)
-            {
-                Log::log<Log::level::ERR>("Failed to convert git hash",
-                                          Log::entry("ERROR=%s", e.what()));
+                MetaRevision revision = rev.value();
+                devId.fwMajor = static_cast<uint7_t>(revision.major);
+
+                revision.minor = (revision.minor > 99 ? 99 : revision.minor);
+                devId.fwMinor =
+                    revision.minor % 10 + (revision.minor / 10) * 16;
+                try
+                {
+                    uint32_t hash = std::stoul(revision.metaHash, 0, 16);
+                    hash = bswap_32(hash);
+                    devId.aux = (revision.buildNo & 0xFF) + (hash & 0xFFFFFF00);
+                    fwVerInitialized = true;
+                }
+                catch (const std::exception& e)
+                {
+                    phosphor::logging::log<phosphor::logging::level::ERR>(
+                        "Failed to convert git hash",
+                        phosphor::logging::entry("ERROR=%s", e.what()));
+                }
             }
         }
     }
@@ -317,13 +295,15 @@
             }
             else
             {
-                Log::log<Log::level::ERR>("Device ID JSON parser failure");
+                phosphor::logging::log<phosphor::logging::level::ERR>(
+                    "Device ID JSON parser failure");
                 return ipmi::responseUnspecifiedError();
             }
         }
         else
         {
-            Log::log<Log::level::ERR>("Device ID file not found");
+            phosphor::logging::log<phosphor::logging::level::ERR>(
+                "Device ID file not found");
             return ipmi::responseUnspecifiedError();
         }
 
@@ -349,21 +329,18 @@
         }
     }
 
-    // Set availability to the actual current BMC state
-    devId.fw[0] &= ipmiDevIdFw1Mask;
-    if (!getCurrentBmcStateWithFallback(defaultActivationSetting))
-    {
-        devId.fw[0] |= ipmiDevIdBusy;
-    }
+    // Set availability to the actual current BMC state.
+    // The availability may change in run time so don't cache.
+    bool bmcDevBusy = getCurrentBmcStateWithFallback(defaultActivationSetting);
 
-    return ipmi::responseSuccess(
-        devId.id, devId.revision, devId.fw[0], devId.fw[1], devId.ipmiVer,
-        devId.addnDevSupport, devId.manufId, devId.prodId, devId.aux);
+    return ipmi::responseSuccess(devId.id, devId.revision, devId.fwMajor,
+                                 bmcDevBusy, devId.fwMinor, devId.ipmiVer,
+                                 devId.addnDevSupport, devId.manufId,
+                                 devId.prodId, devId.aux);
 }
 
 static void registerAPPFunctions(void)
 {
-    Log::log<Log::level::INFO>("Registering App commands");
     // <Get Device ID>
     registerHandler(prioOemBase, netFnApp, app::cmdGetDeviceId, Privilege::User,
                     ipmiAppGetDeviceId);
