diff --git a/occ_manager.cpp b/occ_manager.cpp
index 3ae11f6..302a733 100644
--- a/occ_manager.cpp
+++ b/occ_manager.cpp
@@ -2,7 +2,6 @@
 
 #include "occ_manager.hpp"
 
-#include "i2c_occ.hpp"
 #include "occ_dbus.hpp"
 #include "occ_errors.hpp"
 #include "utils.hpp"
@@ -58,7 +57,6 @@
 
 void Manager::createPldmHandle()
 {
-#ifdef PLDM
     pldmHandle = std::make_unique<pldm::Interface>(
         std::bind(std::mem_fn(&Manager::updateOCCActive), this,
                   std::placeholders::_1, std::placeholders::_2),
@@ -67,7 +65,6 @@
         std::bind(std::mem_fn(&Manager::updateOccSafeMode), this,
                   std::placeholders::_1),
         std::bind(std::mem_fn(&Manager::hostPoweredOff), this), event);
-#endif
 }
 
 // findAndCreateObjects():
@@ -80,14 +77,6 @@
 // - restart discoverTimer if all data is not available yet
 void Manager::findAndCreateObjects()
 {
-#ifndef POWER10
-    for (auto id = 0; id < MAX_CPUS; ++id)
-    {
-        // Create one occ per cpu
-        auto occ = std::string(OCC_NAME) + std::to_string(id);
-        createObjects(occ);
-    }
-#else
     if (!pmode)
     {
         // Create the power mode object
@@ -164,7 +153,7 @@
                     tracedHostWait = true;
                 }
                 discoverTimer->restartOnce(30s);
-#ifdef PLDM
+
                 if (throttlePldmTraceTimer->isEnabled())
                 {
                     // Host is no longer running, disable throttle timer and
@@ -173,7 +162,6 @@
                     throttlePldmTraceTimer->setEnabled(false);
                     pldmHandle->setTraceThrottle(false);
                 }
-#endif
             }
         }
     }
@@ -184,10 +172,8 @@
             "FILE", HOST_ON_FILE);
         discoverTimer->restartOnce(10s);
     }
-#endif
 }
 
-#ifdef POWER10
 // Check if all occActive sensors are available
 void Manager::checkAllActiveSensors()
 {
@@ -229,22 +215,18 @@
                             "checkAllActiveSensors(): Waiting on OCC{INST} Active sensor",
                             "INST", instance);
                         tracedSensorWait = true;
-#ifdef PLDM
                         // Make sure PLDM traces are not throttled
                         pldmHandle->setTraceThrottle(false);
                         // Start timer to throttle PLDM traces when timer
                         // expires
                         onPldmTimeoutCreatePel = false;
                         throttlePldmTraceTimer->restartOnce(5min);
-#endif
                     }
-#ifdef PLDM
                     // Ignore active sensor check if the OCCs are being reset
                     if (!resetInProgress)
                     {
                         pldmHandle->checkActiveSensor(obj->getOccInstanceID());
                     }
-#endif
                     break;
                 }
             }
@@ -256,7 +238,6 @@
         {
             waitingForHost = true;
             lg2::info("checkAllActiveSensors(): Waiting for host to start");
-#ifdef PLDM
             if (throttlePldmTraceTimer->isEnabled())
             {
                 // Host is no longer running, disable throttle timer and
@@ -265,7 +246,6 @@
                 throttlePldmTraceTimer->setEnabled(false);
                 pldmHandle->setTraceThrottle(false);
             }
-#endif
         }
     }
 
@@ -276,14 +256,12 @@
         {
             discoverTimer->setEnabled(false);
         }
-#ifdef PLDM
         if (throttlePldmTraceTimer->isEnabled())
         {
             // Disable throttle timer and make sure traces are not throttled
             throttlePldmTraceTimer->setEnabled(false);
             pldmHandle->setTraceThrottle(false);
         }
-#endif
         if (waitingForAllOccActiveSensors)
         {
             lg2::info(
@@ -319,7 +297,6 @@
         discoverTimer->restartOnce(10s);
     }
 }
-#endif
 
 std::vector<int> Manager::findOCCsInDev()
 {
@@ -364,20 +341,13 @@
     auto path = fs::path(OCC_CONTROL_ROOT) / occ;
 
     statusObjects.emplace_back(std::make_unique<Status>(
-        event, path.c_str(), *this,
-#ifdef POWER10
-        pmode,
-#endif
+        event, path.c_str(), *this, pmode,
         std::bind(std::mem_fn(&Manager::statusCallBack), this,
-                  std::placeholders::_1, std::placeholders::_2)
-#ifdef PLDM
-            ,
+                  std::placeholders::_1, std::placeholders::_2),
         // Callback will set flag indicating reset needs to be done
         // instead of immediately issuing a reset via PLDM.
         std::bind(std::mem_fn(&Manager::resetOccRequest), this,
-                  std::placeholders::_1)
-#endif
-            ));
+                  std::placeholders::_1)));
 
     // Create the power cap monitor object
     if (!pcap)
@@ -392,19 +362,12 @@
                   statusObjects.back()->getOccInstanceID());
         _pollTimer->setEnabled(false);
 
-#ifdef POWER10
         // Set the master OCC on the PowerMode object
         pmode->setMasterOcc(path);
-#endif
     }
 
-    passThroughObjects.emplace_back(std::make_unique<PassThrough>(
-        path.c_str()
-#ifdef POWER10
-            ,
-        pmode
-#endif
-        ));
+    passThroughObjects.emplace_back(
+        std::make_unique<PassThrough>(path.c_str(), pmode));
 }
 
 // If a reset is not already outstanding, set a flag to indicate that a reset is
@@ -447,9 +410,7 @@
             }
         }
 
-#ifdef PLDM
         pldmHandle->resetOCC(instance);
-#endif
         resetRequired = false;
     }
     else
@@ -475,17 +436,14 @@
         // OCC went active
         ++activeCount;
 
-#ifdef POWER10
         if (activeCount == 1)
         {
             // First OCC went active (allow some time for all OCCs to go active)
             waitForAllOccsTimer->restartOnce(60s);
         }
-#endif
 
         if (activeCount == statusObjects.size())
         {
-#ifdef POWER10
             // All OCCs are now running
             if (waitForAllOccsTimer->isEnabled())
             {
@@ -511,10 +469,6 @@
                 // Verify master OCC and start presence monitor
                 validateOccMaster();
             }
-#else
-            // Verify master OCC and start presence monitor
-            validateOccMaster();
-#endif
         }
 
         // Start poll timer if not already started (since at least one OCC is
@@ -574,13 +528,11 @@
                 _pollTimer->setEnabled(false);
             }
 
-#ifdef POWER10
             // stop wait timer
             if (waitForAllOccsTimer->isEnabled())
             {
                 waitForAllOccsTimer->setEnabled(false);
             }
-#endif
         }
         else if (resetInProgress)
         {
@@ -588,13 +540,10 @@
                 "statusCallBack: Skipping clear of resetInProgress (activeCount={COUNT}, OCC{INST}, status={STATUS})",
                 "COUNT", activeCount, "INST", instance, "STATUS", status);
         }
-#ifdef READ_OCC_SENSORS
         // Clear OCC sensors
         setSensorValueToNaN(instance);
-#endif
     }
 
-#ifdef POWER10
     if (waitingForAllOccActiveSensors)
     {
         if (utils::isHostRunning())
@@ -602,37 +551,8 @@
             checkAllActiveSensors();
         }
     }
-#endif
 }
 
-#ifdef I2C_OCC
-void Manager::initStatusObjects()
-{
-    // Make sure we have a valid path string
-    static_assert(sizeof(DEV_PATH) != 0);
-
-    auto deviceNames = i2c_occ::getOccHwmonDevices(DEV_PATH);
-    for (auto& name : deviceNames)
-    {
-        i2c_occ::i2cToDbus(name);
-        name = std::string(OCC_NAME) + '_' + name;
-        auto path = fs::path(OCC_CONTROL_ROOT) / name;
-        statusObjects.emplace_back(
-            std::make_unique<Status>(event, path.c_str(), *this));
-    }
-    // The first device is master occ
-    pcap = std::make_unique<open_power::occ::powercap::PowerCap>(
-        *statusObjects.front());
-#ifdef POWER10
-    pmode = std::make_unique<powermode::PowerMode>(*this, powermode::PMODE_PATH,
-                                                   powermode::PIPS_PATH);
-    // Set the master OCC on the PowerMode object
-    pmode->setMasterOcc(path);
-#endif
-}
-#endif
-
-#ifdef PLDM
 void Manager::sbeTimeout(unsigned int instance)
 {
     auto obj = std::find_if(statusObjects.begin(), statusObjects.end(),
@@ -678,9 +598,7 @@
                     "updateOCCActive: Waiting for Host and all OCC Active Sensors");
                 waitingForAllOccActiveSensors = true;
             }
-#ifdef POWER10
             discoverTimer->restartOnce(30s);
-#endif
             return false;
         }
         else
@@ -727,9 +645,7 @@
 // Called upon pldm event To set powermode Safe Mode State for system.
 void Manager::updateOccSafeMode(bool safeMode)
 {
-#ifdef POWER10
     pmode->updateDbusSafeMode(safeMode);
-#endif
     // Update the processor throttle status on dbus
     for (auto& obj : statusObjects)
     {
@@ -899,7 +815,6 @@
     return nullptr;
 }
 #endif
-#endif
 
 void Manager::pollerTimerExpired()
 {
@@ -909,7 +824,6 @@
         return;
     }
 
-#ifdef POWER10
     if (resetRequired)
     {
         lg2::error("pollerTimerExpired() - Initiating PM Complex reset");
@@ -923,27 +837,22 @@
         }
         return;
     }
-#endif
 
     for (auto& obj : statusObjects)
     {
         if (!obj->occActive())
         {
             // OCC is not running yet
-#ifdef READ_OCC_SENSORS
             auto id = obj->getOccInstanceID();
             setSensorValueToNaN(id);
-#endif
             continue;
         }
 
         // Read sysfs to force kernel to poll OCC
         obj->readOccState();
 
-#ifdef READ_OCC_SENSORS
         // Read occ sensor values
         getSensorValues(obj);
-#endif
     }
 
     if (activeCount > 0)
@@ -959,7 +868,6 @@
     }
 }
 
-#ifdef READ_OCC_SENSORS
 void Manager::readTempSensors(const fs::path& path, uint32_t occInstance)
 {
     // There may be more than one sensor with the same FRU type
@@ -1475,7 +1383,6 @@
 
     return;
 }
-#endif
 
 // Read the altitude from DBus
 void Manager::readAltitude()
@@ -1571,7 +1478,7 @@
 
         lg2::debug("ambientCallback: Ambient: {TEMP}C, altitude: {ALT}m",
                    "TEMP", ambient, "ALT", altitude);
-#ifdef POWER10
+
         // Send ambient and altitude to all OCCs
         for (auto& obj : statusObjects)
         {
@@ -1580,7 +1487,6 @@
                 obj->sendAmbient(ambient, altitude);
             }
         }
-#endif // POWER10
     }
 }
 
@@ -1598,7 +1504,6 @@
     }
 }
 
-#ifdef POWER10
 // Called when waitForAllOccsTimer expires
 // After the first OCC goes active, this timer will be started (60 seconds)
 void Manager::occsNotAllRunning()
@@ -1635,7 +1540,6 @@
     }
 }
 
-#ifdef PLDM
 // Called when throttlePldmTraceTimer expires.
 // If this timer expires, that indicates there are no OCC active sensor PDRs
 // found which will trigger pldm traces to be throttled.
@@ -1712,8 +1616,6 @@
                    e.what());
     }
 }
-#endif // PLDM
-#endif // POWER10
 
 // Verify single master OCC and start presence monitor
 void Manager::validateOccMaster()
@@ -1722,7 +1624,7 @@
     for (auto& obj : statusObjects)
     {
         auto instance = obj->getOccInstanceID();
-#ifdef POWER10
+
         if (!obj->occActive())
         {
             if (utils::isHostRunning())
@@ -1739,9 +1641,7 @@
                 else
                 {
                     // OCC does not appear to be active yet, check active sensor
-#ifdef PLDM
                     pldmHandle->checkActiveSensor(instance);
-#endif
                     if (obj->occActive())
                     {
                         lg2::info(
@@ -1758,7 +1658,6 @@
                 return;
             }
         }
-#endif // POWER10
 
         if (obj->isMasterOcc())
         {
@@ -1791,9 +1690,8 @@
     {
         lg2::info("validateOccMaster: OCC{INST} is master of {COUNT} OCCs",
                   "INST", masterInstance, "COUNT", activeCount);
-#ifdef POWER10
+
         pmode->updateDbusSafeMode(false);
-#endif
     }
 }
 
