diff --git a/src/PSUSensorMain.cpp b/src/PSUSensorMain.cpp
index 35610c5..93d280f 100644
--- a/src/PSUSensorMain.cpp
+++ b/src/PSUSensorMain.cpp
@@ -138,7 +138,6 @@
 static GroupEventPathList groupEventMatch;
 static EventPathList limitEventMatch;
 
-static std::vector<PSUProperty> psuProperties;
 static boost::container::flat_map<size_t, bool> cpuPresence;
 static boost::container::flat_map<DevTypes, DevParams> devParamMap;
 
@@ -668,8 +667,7 @@
             // by making a copy and modifying that instead.
             // Avoid bleedthrough of one device's customizations to
             // the next device, as each should be independently customizable.
-            psuProperties.push_back(findProperty->second);
-            auto psuProperty = psuProperties.rbegin();
+            PSUProperty psuProperty = findProperty->second;
 
             // Use label head as prefix for reading from config file,
             // example if temp1: temp1_Name, temp1_Scale, temp1_Min, ...
@@ -686,7 +684,7 @@
             {
                 try
                 {
-                    psuProperty->labelTypeName = std::visit(
+                    psuProperty.labelTypeName = std::visit(
                         VariantToStringVisitor(), findCustomName->second);
                 }
                 catch (const std::invalid_argument&)
@@ -705,7 +703,7 @@
             {
                 try
                 {
-                    psuProperty->sensorScaleFactor = std::visit(
+                    psuProperty.sensorScaleFactor = std::visit(
                         VariantToUnsignedIntVisitor(), findCustomScale->second);
                 }
                 catch (const std::invalid_argument&)
@@ -715,7 +713,7 @@
                 }
 
                 // Avoid later division by zero
-                if (psuProperty->sensorScaleFactor > 0)
+                if (psuProperty.sensorScaleFactor > 0)
                 {
                     customizedScale = true;
                 }
@@ -731,7 +729,7 @@
             {
                 try
                 {
-                    psuProperty->minReading = std::visit(
+                    psuProperty.minReading = std::visit(
                         VariantToDoubleVisitor(), findCustomMin->second);
                 }
                 catch (const std::invalid_argument&)
@@ -746,7 +744,7 @@
             {
                 try
                 {
-                    psuProperty->maxReading = std::visit(
+                    psuProperty.maxReading = std::visit(
                         VariantToDoubleVisitor(), findCustomMax->second);
                 }
                 catch (const std::invalid_argument&)
@@ -761,7 +759,7 @@
             {
                 try
                 {
-                    psuProperty->sensorOffset = std::visit(
+                    psuProperty.sensorOffset = std::visit(
                         VariantToDoubleVisitor(), findCustomOffset->second);
                 }
                 catch (const std::invalid_argument&)
@@ -779,7 +777,7 @@
                                                     findPowerState->second);
                 setReadState(powerState, readState);
             }
-            if (!(psuProperty->minReading < psuProperty->maxReading))
+            if (!(psuProperty.minReading < psuProperty.maxReading))
             {
                 std::cerr << "Min must be less than Max\n";
                 continue;
@@ -837,7 +835,7 @@
             // Similarly, if sensor scaling factor is being customized,
             // then the below power-of-10 constraint becomes unnecessary,
             // as config should be able to specify an arbitrary divisor.
-            unsigned int factor = psuProperty->sensorScaleFactor;
+            unsigned int factor = psuProperty.sensorScaleFactor;
             if (!customizedScale)
             {
                 // Preserve existing usage of hardcoded labelMatch table below
@@ -884,14 +882,14 @@
             if constexpr (debug)
             {
                 std::cerr << "Sensor properties: Name \""
-                          << psuProperty->labelTypeName << "\" Scale "
-                          << psuProperty->sensorScaleFactor << " Min "
-                          << psuProperty->minReading << " Max "
-                          << psuProperty->maxReading << " Offset "
-                          << psuProperty->sensorOffset << "\n";
+                          << psuProperty.labelTypeName << "\" Scale "
+                          << psuProperty.sensorScaleFactor << " Min "
+                          << psuProperty.minReading << " Max "
+                          << psuProperty.maxReading << " Offset "
+                          << psuProperty.sensorOffset << "\n";
             }
 
-            std::string sensorName = psuProperty->labelTypeName;
+            std::string sensorName = psuProperty.labelTypeName;
             if (customizedName)
             {
                 if (sensorName.empty())
@@ -906,8 +904,7 @@
             {
                 // Sensor name not customized, do prefix/suffix composition,
                 // preserving default behavior by using psuNameFromIndex.
-                sensorName = psuNameFromIndex + " " +
-                             psuProperty->labelTypeName;
+                sensorName = psuNameFromIndex + " " + psuProperty.labelTypeName;
             }
 
             if constexpr (debug)
@@ -934,8 +931,8 @@
                     sensorPathStr, sensorType, objectServer, dbusConnection, io,
                     sensorName, std::move(sensorThresholds), *interfacePath,
                     readState, findSensorUnit->second, factor,
-                    psuProperty->maxReading, psuProperty->minReading,
-                    psuProperty->sensorOffset, labelHead, thresholdConfSize,
+                    psuProperty.maxReading, psuProperty.minReading,
+                    psuProperty.sensorOffset, labelHead, thresholdConfSize,
                     pollRate, i2cDev);
                 sensors[sensorName]->setupRead();
                 ++numCreated;
