diff --git a/redfish-core/lib/chassis.hpp b/redfish-core/lib/chassis.hpp
index 5cc4531..ae3201a 100644
--- a/redfish-core/lib/chassis.hpp
+++ b/redfish-core/lib/chassis.hpp
@@ -181,14 +181,6 @@
             "/redfish/v1/$metadata#ChassisCollection.ChassisCollection";
         res.jsonValue["Name"] = "Chassis Collection";
 
-#ifdef BMCWEB_ENABLE_REDFISH_ONE_CHASSIS
-        // Assume one Chassis named "chassis"
-        res.jsonValue["Members@odata.count"] = 1;
-        res.jsonValue["Members"] = {
-            {{"@odata.id", "/redfish/v1/Chassis/chassis"}}};
-        res.end();
-        return;
-#endif
         const std::array<const char *, 3> interfaces = {
             "xyz.openbmc_project.Inventory.Item.Board",
             "xyz.openbmc_project.Inventory.Item.Chassis",
@@ -268,16 +260,6 @@
             return;
         }
         const std::string &chassisId = params[0];
-#ifdef BMCWEB_ENABLE_REDFISH_ONE_CHASSIS
-        // In a one chassis system the only supported name is "chassis"
-        if (chassisId != "chassis")
-        {
-            messages::resourceNotFound(res, "#Chassis.v1_4_0.Chassis",
-                                       chassisId);
-            res.end();
-            return;
-        }
-#endif
 
         auto asyncResp = std::make_shared<AsyncResp>(res);
         crow::connections::systemBus->async_method_call(
@@ -304,13 +286,11 @@
                         std::pair<std::string, std::vector<std::string>>>
                         &connectionNames = object.second;
 
-// If only one chassis, just select the first one
-#ifndef BMCWEB_ENABLE_REDFISH_ONE_CHASSIS
                     if (!boost::ends_with(path, chassisId))
                     {
                         continue;
                     }
-#endif
+
                     if (connectionNames.size() < 1)
                     {
                         BMCWEB_LOG_ERROR << "Only got "
diff --git a/redfish-core/lib/managers.hpp b/redfish-core/lib/managers.hpp
index 65bea03..2df6034 100644
--- a/redfish-core/lib/managers.hpp
+++ b/redfish-core/lib/managers.hpp
@@ -989,11 +989,7 @@
         res.jsonValue["Links"]["ManagerForServers@odata.count"] = 1;
         res.jsonValue["Links"]["ManagerForServers"] = {
             {{"@odata.id", "/redfish/v1/Systems/system"}}};
-#ifdef BMCWEB_ENABLE_REDFISH_ONE_CHASSIS
-        res.jsonValue["Links"]["ManagerForChassis@odata.count"] = 1;
-        res.jsonValue["Links"]["ManagerForChassis"] = {
-            {{"@odata.id", "/redfish/v1/Chassis/chassis"}}};
-#endif
+
         std::shared_ptr<AsyncResp> asyncResp = std::make_shared<AsyncResp>(res);
 
         crow::connections::systemBus->async_method_call(
diff --git a/redfish-core/lib/power.hpp b/redfish-core/lib/power.hpp
index d80ace7..2184114 100644
--- a/redfish-core/lib/power.hpp
+++ b/redfish-core/lib/power.hpp
@@ -51,16 +51,6 @@
             return;
         }
         const std::string& chassis_name = params[0];
-#ifdef BMCWEB_ENABLE_REDFISH_ONE_CHASSIS
-        // In a one chassis system the only supported name is "chassis"
-        if (chassis_name != "chassis")
-        {
-            messages::resourceNotFound(res, "#Chassis.v1_4_0.Chassis",
-                                       chassis_name);
-            res.end();
-            return;
-        }
-#endif
 
         auto sensorAsyncResp = std::make_shared<SensorsAsyncResp>(
             res, chassis_name, typeList, "Power");
diff --git a/redfish-core/lib/sensors.hpp b/redfish-core/lib/sensors.hpp
index 69ee983..6fba7c0 100644
--- a/redfish-core/lib/sensors.hpp
+++ b/redfish-core/lib/sensors.hpp
@@ -28,8 +28,6 @@
 namespace redfish
 {
 
-constexpr const char* dbusSensorPrefix = "/xyz/openbmc_project/sensors/";
-
 using GetSubTreeType = std::vector<
     std::pair<std::string,
               std::vector<std::pair<std::string, std::vector<std::string>>>>>;
@@ -172,65 +170,6 @@
 }
 
 /**
- * @brief Gets all DBus sensor names.
- *
- * Finds the sensor names asynchronously.  Invokes callback when information has
- * been obtained.
- *
- * The callback must have the following signature:
- *   @code
- *   callback(boost::container::flat_set<std::string>& sensorNames)
- *   @endcode
- *
- * @param SensorsAsyncResp Pointer to object holding response data.
- * @param callback Callback to invoke when sensor names obtained.
- */
-template <typename Callback>
-void getAllSensors(std::shared_ptr<SensorsAsyncResp> SensorsAsyncResp,
-                   Callback&& callback)
-{
-    BMCWEB_LOG_DEBUG << "getAllSensors enter";
-    const std::array<std::string, 1> interfaces = {
-        "xyz.openbmc_project.Sensor.Value"};
-
-    // Response handler for GetSubTreePaths DBus method
-    auto respHandler = [callback{std::move(callback)}, SensorsAsyncResp](
-                           const boost::system::error_code ec,
-                           const std::vector<std::string>& sensorList) {
-        BMCWEB_LOG_DEBUG << "getAllSensors respHandler enter";
-        if (ec)
-        {
-            messages::internalError(SensorsAsyncResp->res);
-            BMCWEB_LOG_ERROR << "getAllSensors respHandler: DBus error " << ec;
-            return;
-        }
-        boost::container::flat_set<std::string> sensorNames;
-        for (const std::string& sensor : sensorList)
-        {
-            std::size_t lastPos = sensor.rfind("/");
-            if (lastPos == std::string::npos)
-            {
-                BMCWEB_LOG_ERROR << "Failed to find '/' in " << sensor;
-                continue;
-            }
-            std::string sensorName = sensor.substr(lastPos + 1);
-            sensorNames.emplace(sensorName);
-            BMCWEB_LOG_DEBUG << "Added sensor name " << sensorName;
-        }
-        callback(sensorNames);
-        BMCWEB_LOG_DEBUG << "getAllSensors respHandler exit";
-    };
-
-    // Query mapper for all DBus sensor object paths
-    crow::connections::systemBus->async_method_call(
-        std::move(respHandler), "xyz.openbmc_project.ObjectMapper",
-        "/xyz/openbmc_project/object_mapper",
-        "xyz.openbmc_project.ObjectMapper", "GetSubTreePaths",
-        "/xyz/openbmc_project/sensors", int32_t(0), interfaces);
-    BMCWEB_LOG_DEBUG << "getAllSensors exit";
-}
-
-/**
  * @brief Shrinks the list of sensors for processing
  * @param SensorsAysncResp  The class holding the Redfish response
  * @param allSensors  A list of all the sensors associated to the
@@ -1076,13 +1015,8 @@
             BMCWEB_LOG_DEBUG << "getChassisCb exit";
         };
 
-#ifdef BMCWEB_ENABLE_REDFISH_ONE_CHASSIS
-    // Get all sensor names
-    getAllSensors(SensorsAsyncResp, std::move(getChassisCb));
-#else
-    // Get sensor names in chassis
+    // Get set of sensors in chassis
     getChassis(SensorsAsyncResp, std::move(getChassisCb));
-#endif
     BMCWEB_LOG_DEBUG << "getChassisData exit";
 };
 
diff --git a/redfish-core/lib/systems.hpp b/redfish-core/lib/systems.hpp
index 236767c..8019d8c 100644
--- a/redfish-core/lib/systems.hpp
+++ b/redfish-core/lib/systems.hpp
@@ -1139,11 +1139,6 @@
         res.jsonValue["LogServices"] = {
             {"@odata.id", "/redfish/v1/Systems/system/LogServices"}};
 
-#ifdef BMCWEB_ENABLE_REDFISH_ONE_CHASSIS
-        res.jsonValue["Links"]["Chassis"] = {
-            {{"@odata.id", "/redfish/v1/Chassis/chassis"}}};
-#endif
-
         auto asyncResp = std::make_shared<AsyncResp>(res);
 
         getLedGroupIdentify(
diff --git a/redfish-core/lib/thermal.hpp b/redfish-core/lib/thermal.hpp
index 7c84039..384fe1a 100644
--- a/redfish-core/lib/thermal.hpp
+++ b/redfish-core/lib/thermal.hpp
@@ -51,16 +51,6 @@
             return;
         }
         const std::string& chassisName = params[0];
-#ifdef BMCWEB_ENABLE_REDFISH_ONE_CHASSIS
-        // In a one chassis system the only supported name is "chassis"
-        if (chassisName != "chassis")
-        {
-            messages::resourceNotFound(res, "#Chassis.v1_4_0.Chassis",
-                                       chassisName);
-            res.end();
-            return;
-        }
-#endif
 
         auto sensorAsyncResp = std::make_shared<SensorsAsyncResp>(
             res, chassisName, typeList, "Thermal");
