diff --git a/dbus-sdr/sensorcommands.cpp b/dbus-sdr/sensorcommands.cpp
index 7b88958..0bf639b 100644
--- a/dbus-sdr/sensorcommands.cpp
+++ b/dbus-sdr/sensorcommands.cpp
@@ -78,6 +78,17 @@
 static uint32_t sdrLastAdd = noTimestamp;
 static uint32_t sdrLastRemove = noTimestamp;
 static constexpr size_t lastRecordIndex = 0xFFFF;
+
+// The IPMI spec defines four Logical Units (LUN), each capable of supporting
+// 255 sensors. The 256 values assigned to LUN 2 are special and are not used
+// for general purpose sensors. Each LUN reserves location 0xFF. The maximum
+// number of IPMI sensors are LUN 0 + LUN 1 + LUN 2, less the reserved
+// location.
+static constexpr size_t maxIPMISensors = ((3 * 256) - (3 * 1));
+
+static constexpr size_t lun0MaxSensorNum = 0xfe;
+static constexpr size_t lun1MaxSensorNum = 0x1fe;
+static constexpr size_t lun3MaxSensorNum = 0x3fe;
 static constexpr int GENERAL_ERROR = -1;
 
 static boost::container::flat_map<std::string, ObjectValueTree> SensorCache;
@@ -1868,6 +1879,11 @@
     return true;
 }
 
+static inline uint16_t getNumberOfSensors()
+{
+    return std::min(getSensorTree().size(), maxIPMISensors);
+}
+
 static int
     getSensorDataRecord(ipmi::Context::ptr ctx,
                         std::vector<uint8_t>& recordData, uint16_t recordID,
@@ -1882,9 +1898,8 @@
         return GENERAL_ERROR;
     }
 
-    auto& sensorTree = getSensorTree();
     size_t lastRecord =
-        sensorTree.size() + fruCount + ipmi::storage::type12Count + -1;
+        getNumberOfSensors() + fruCount + ipmi::storage::type12Count - 1;
     if (recordID == lastRecordIndex)
     {
         recordID = lastRecord;
@@ -1896,9 +1911,9 @@
         return GENERAL_ERROR;
     }
 
-    if (recordID >= sensorTree.size())
+    if (recordID >= getNumberOfSensors())
     {
-        size_t fruIndex = recordID - sensorTree.size();
+        size_t fruIndex = recordID - getNumberOfSensors();
 
         if (fruIndex >= fruCount)
         {
@@ -1930,29 +1945,34 @@
         return 0;
     }
 
+    // Perform a incremental scan of the SDR Record ID's and translate the
+    // first 765 SDR records (i.e. maxIPMISensors) into IPMI Sensor
+    // Numbers. The IPMI sensor numbers are not linear, and have a reserved
+    // gap at 0xff. This code creates 254 sensors per LUN, excepting LUN 2
+    // which has special meaning.
     std::string connection;
     std::string path;
     std::vector<std::string> interfaces;
     uint16_t sensNumFromRecID{recordID};
-    if ((recordID >= reservedSensorNumber) &&
-        (recordID < (2 * maxSensorsPerLUN)))
+    if ((recordID > lun0MaxSensorNum) && (recordID < lun1MaxSensorNum))
     {
-        sensNumFromRecID = (recordID + 1) & maxSensorsPerLUN;
+        // LUN 0 has one reserved sensor number. Compensate here by adding one
+        // to the record ID
+        sensNumFromRecID = recordID + 1;
         ctx->lun = 1;
     }
-    else if ((recordID >= (2 * maxSensorsPerLUN)) &&
-             (recordID < maxIPMISensors))
+    else if ((recordID >= lun1MaxSensorNum) && (recordID < maxIPMISensors))
     {
-        sensNumFromRecID = (recordID + 2) & maxSensorsPerLUN;
+        // LUN 0, 1 have a reserved sensor number. Compensate here by adding 2
+        // to the record ID. Skip all 256 sensors in LUN 2, as it has special
+        // rules governing its use.
+        sensNumFromRecID = recordID + (maxSensorsPerLUN + 1) + 2;
         ctx->lun = 3;
     }
-    else if (recordID >= maxIPMISensors)
-    {
-        return GENERAL_ERROR;
-    }
 
-    auto status = getSensorConnection(ctx, sensNumFromRecID, connection, path,
-                                      &interfaces);
+    auto status =
+        getSensorConnection(ctx, static_cast<uint8_t>(sensNumFromRecID),
+                            connection, path, &interfaces);
     if (status)
     {
         phosphor::logging::log<phosphor::logging::level::ERR>(
@@ -1960,7 +1980,10 @@
         return GENERAL_ERROR;
     }
     uint16_t sensorNum = getSensorNumberFromPath(path);
-    if (sensorNum >= maxIPMISensors)
+    // Return an error on LUN 2 assingments, and any sensor number beyond the
+    // range of LUN 3
+    if (((sensorNum > lun1MaxSensorNum) && (sensorNum <= maxIPMISensors)) ||
+        (sensorNum > lun3MaxSensorNum))
     {
         phosphor::logging::log<phosphor::logging::level::ERR>(
             "getSensorDataRecord: invalidSensorNumber");
@@ -1969,7 +1992,8 @@
     uint8_t sensornumber = static_cast<uint8_t>(sensorNum);
     uint8_t lun = static_cast<uint8_t>(sensorNum >> 8);
 
-    if ((sensornumber != sensNumFromRecID) && (lun != ctx->lun))
+    if ((sensornumber != static_cast<uint8_t>(sensNumFromRecID)) &&
+        (lun != ctx->lun))
     {
         phosphor::logging::log<phosphor::logging::level::ERR>(
             "getSensorDataRecord: sensor record mismatch");
@@ -2077,7 +2101,7 @@
     {
         return ipmi::responseResponseError();
     }
-    uint16_t numSensors = sensorTree.size();
+    uint16_t numSensors = getNumberOfSensors();
     if (count.value_or(0) == getSdrCount)
     {
         // Count the number of Type 1 SDR entries assigned to the LUN
@@ -2183,7 +2207,7 @@
     }
 
     uint16_t recordCount =
-        sensorTree.size() + fruCount + ipmi::storage::type12Count;
+        getNumberOfSensors() + fruCount + ipmi::storage::type12Count;
 
     uint8_t operationSupport = static_cast<uint8_t>(
         SdrRepositoryInfoOps::overflow); // write not supported
@@ -2266,7 +2290,7 @@
 
     auto& sensorTree = getSensorTree();
     size_t lastRecord =
-        sensorTree.size() + fruCount + ipmi::storage::type12Count - 1;
+        getNumberOfSensors() + fruCount + ipmi::storage::type12Count - 1;
     uint16_t nextRecordId = lastRecord > recordID ? recordID + 1 : 0XFFFF;
 
     if (!getSensorSubtree(sensorTree) && sensorTree.empty())
diff --git a/include/dbus-sdr/sensorcommands.hpp b/include/dbus-sdr/sensorcommands.hpp
index 860bb0e..4689acb 100644
--- a/include/dbus-sdr/sensorcommands.hpp
+++ b/include/dbus-sdr/sensorcommands.hpp
@@ -125,7 +125,7 @@
 }
 
 static ipmi_ret_t
-    getSensorConnection(ipmi::Context::ptr ctx, uint16_t sensnum,
+    getSensorConnection(ipmi::Context::ptr ctx, uint8_t sensnum,
                         std::string& connection, std::string& path,
                         std::vector<std::string>* interfaces = nullptr)
 {
