diff --git a/libpfr/src/pfr.cpp b/libpfr/src/pfr.cpp
index 0997d76..0a07f20 100644
--- a/libpfr/src/pfr.cpp
+++ b/libpfr/src/pfr.cpp
@@ -75,12 +75,6 @@
 static constexpr const uint32_t buildNumOffsetInPFM = 0x40C;
 static constexpr const uint32_t buildHashOffsetInPFM = 0x40D;
 
-static const std::array<std::string, 8> mainCPLDGpioLines = {
-    "MAIN_PLD_MAJOR_REV_BIT3", "MAIN_PLD_MAJOR_REV_BIT2",
-    "MAIN_PLD_MAJOR_REV_BIT1", "MAIN_PLD_MAJOR_REV_BIT0",
-    "MAIN_PLD_MINOR_REV_BIT3", "MAIN_PLD_MINOR_REV_BIT2",
-    "MAIN_PLD_MINOR_REV_BIT1", "MAIN_PLD_MINOR_REV_BIT0"};
-
 bool exceptionFlag = true;
 extern bool bmcBootCompleteChkPointDone;
 extern bool unProvChkPointStatus;
@@ -324,30 +318,8 @@
 
 std::string readCPLDVersion()
 {
-    // CPLD SGPIO lines
-    gpiod::line mainCPLDLine;
-    // read main pld version
-    uint8_t mainCPLDVer = 0;
-    // main CPLD
-    for (const auto& gLine : mainCPLDGpioLines)
-    {
-        uint8_t value = 0;
-        if (getGPIOInput(gLine, mainCPLDLine, &value))
-        {
-            mainCPLDVer <<= 1;
-            mainCPLDVer = mainCPLDVer | value;
-        }
-        else
-        {
-            phosphor::logging::log<phosphor::logging::level::ERR>(
-                "Failed to read GPIO line: ",
-                phosphor::logging::entry("MSG=%s", gLine.c_str()));
-            mainCPLDVer = 0;
-            break;
-        }
-    }
-
     std::string svnRoTHash = "";
+    std::string version = "unknown";
 
     // check if reg 0x00 read 0xde
     uint8_t cpldRoTValue = 0;
@@ -365,12 +337,12 @@
 
     if (cpldRoTValue == pfrRoTValue)
     {
-        // read SVN and RoT version
-        std::string svnRoTver = readVersionFromCPLD(cpldROTVersion, cpldROTSvn);
+        // read RoT Rev and RoT SVN
+        std::string rotRevSVN = readVersionFromCPLD(cpldROTVersion, cpldROTSvn);
 
         // read CPLD hash
         std::string cpldHash = readCPLDHash();
-        svnRoTHash = "-" + svnRoTver + "-" + cpldHash;
+        version = rotRevSVN + "-" + cpldHash;
     }
     else
     {
@@ -378,15 +350,11 @@
             "PFR-CPLD not present.");
     }
 
-    // CPLD version format:
+    // ROT FW Version format:
     // When PFR CPLD is present
-    // <MainPLDMajorMinor>-<SVN.RoT>-<CPLD-Hash>
-    // Example: 2-1.1-<Hash string>
+    // <RoTRev.RoTSVN>-<RoT HASH>
+    // Example: 3.0-<Hash string>
 
-    // When Non-PFR CPLD is present -> <MainPLDMajorMinor>
-    // Example: 2
-
-    std::string version = std::to_string(mainCPLDVer) + svnRoTHash;
     return version;
 }
 
diff --git a/service/src/mainapp.cpp b/service/src/mainapp.cpp
index ee21db1..fc3f75a 100644
--- a/service/src/mainapp.cpp
+++ b/service/src/mainapp.cpp
@@ -49,7 +49,7 @@
                         versionPurposeBMC),
         std::make_tuple("bios_recovery", ImageType::biosRecovery,
                         versionPurposeHost),
-        std::make_tuple("cpld_recovery", ImageType::cpldRecovery,
+        std::make_tuple("rot_fw_recovery", ImageType::cpldRecovery,
                         versionPurposeOther),
         std::make_tuple("afm_active", ImageType::afmActive,
                         versionPurposeOther),
@@ -570,19 +570,19 @@
 static void updateCPLDversion(std::shared_ptr<sdbusplus::asio::connection> conn)
 {
     std::string cpldVersion = pfr::readCPLDVersion();
-    lg2::info("VERSION INFO - cpld_active - {VER}", "VER", cpldVersion);
+    lg2::info("VERSION INFO - rot_fw_active - {VER}", "VER", cpldVersion);
     conn->async_method_call(
         [](const boost::system::error_code ec) {
         if (ec)
         {
             phosphor::logging::log<phosphor::logging::level::ERR>(
-                "Unable to update cpld_active version",
+                "Unable to update rot_fw_active version",
                 phosphor::logging::entry("MSG=%s", ec.message().c_str()));
             return;
         }
         },
         "xyz.openbmc_project.Settings",
-        "/xyz/openbmc_project/software/cpld_active",
+        "/xyz/openbmc_project/software/rot_fw_active",
         "org.freedesktop.DBus.Properties", "Set",
         "xyz.openbmc_project.Software.Version", "Version",
         std::variant<std::string>(cpldVersion));
@@ -665,7 +665,7 @@
 
             // Update the D-Bus properties.
             updateDbusPropertiesCache();
-            // Update CPLD Version to cpld_active object in settings.
+            // Update CPLD Version to rot_fw_active object in settings.
             updateCPLDversion(conn);
         }
         retrCount--;
@@ -686,7 +686,7 @@
 
     pfr::checkPFRandAddObjects(server, conn);
 
-    // Update CPLD Version to cpld_active object in settings.
+    // Update CPLD Version to rot_fw_active object in settings.
     pfr::updateCPLDversion(conn);
 
     server.add_manager("/xyz/openbmc_project/pfr");
