diff --git a/src/discrete_threshold.cpp b/src/discrete_threshold.cpp
index 3c98c93..a2073b7 100644
--- a/src/discrete_threshold.cpp
+++ b/src/discrete_threshold.cpp
@@ -4,37 +4,39 @@
 
 DiscreteThreshold::DiscreteThreshold(
     boost::asio::io_context& ioc, Sensors sensorsIn,
-    std::vector<std::string> sensorNames,
     std::vector<std::unique_ptr<interfaces::TriggerAction>> actionsIn,
     Milliseconds dwellTimeIn, double thresholdValueIn,
-    const std::string& name) :
+    const std::string& nameIn, const discrete::Severity severityIn) :
     ioc(ioc),
-    sensors(std::move(sensorsIn)), actions(std::move(actionsIn)),
-    dwellTime(dwellTimeIn), thresholdValue(thresholdValueIn), name(name)
+    actions(std::move(actionsIn)), dwellTime(dwellTimeIn),
+    thresholdValue(thresholdValueIn), name(nameIn), severity(severityIn)
 {
-    details.reserve(sensors.size());
-    for (size_t i = 0; i < sensors.size(); i++)
+    for (const auto& sensor : sensorsIn)
     {
-        details.emplace_back(sensorNames[i], false, ioc);
+        sensorDetails.emplace(sensor, makeDetails(sensor->getName()));
     }
 }
 
 void DiscreteThreshold::initialize()
 {
-    for (auto& sensor : sensors)
-    {
-        sensor->registerForUpdates(weak_from_this());
-    }
+    ThresholdOperations().initialize(this);
+}
+
+void DiscreteThreshold::updateSensors(Sensors newSensors)
+{
+    ThresholdOperations().updateSensors(this, std::move(newSensors));
 }
 
 DiscreteThreshold::ThresholdDetail&
-    DiscreteThreshold::getDetails(interfaces::Sensor& sensor)
+    DiscreteThreshold::getDetails(const interfaces::Sensor& sensor)
 {
-    auto it =
-        std::find_if(sensors.begin(), sensors.end(),
-                     [&sensor](const auto& x) { return &sensor == x.get(); });
-    auto index = std::distance(sensors.begin(), it);
-    return details.at(index);
+    return ThresholdOperations().getDetails(this, sensor);
+}
+
+std::shared_ptr<DiscreteThreshold::ThresholdDetail>
+    DiscreteThreshold::makeDetails(const std::string& sensorName)
+{
+    return std::make_shared<ThresholdDetail>(sensorName, false, ioc);
 }
 
 void DiscreteThreshold::sensorUpdated(interfaces::Sensor& sensor,
@@ -44,7 +46,8 @@
 void DiscreteThreshold::sensorUpdated(interfaces::Sensor& sensor,
                                       Milliseconds timestamp, double value)
 {
-    auto& [sensorName, dwell, timer] = getDetails(sensor);
+    auto& details = getDetails(sensor);
+    auto& [sensorName, dwell, timer] = details;
 
     if (thresholdValue)
     {
@@ -55,15 +58,18 @@
         }
         else if (value == thresholdValue)
         {
-            startTimer(sensor, timestamp, value);
+            startTimer(details, timestamp, value);
         }
     }
 }
 
-void DiscreteThreshold::startTimer(interfaces::Sensor& sensor,
+void DiscreteThreshold::startTimer(DiscreteThreshold::ThresholdDetail& details,
                                    Milliseconds timestamp, double value)
 {
-    auto& [sensorName, dwell, timer] = getDetails(sensor);
+    const auto& sensorName = details.sensorName;
+    auto& dwell = details.dwell;
+    auto& timer = details.timer;
+
     if (dwellTime == Milliseconds::zero())
     {
         commit(sensorName, timestamp, value);
@@ -72,7 +78,7 @@
     {
         dwell = true;
         timer.expires_after(dwellTime);
-        timer.async_wait([this, &sensor, timestamp,
+        timer.async_wait([this, &sensorName, &dwell, timestamp,
                           value](const boost::system::error_code ec) {
             if (ec)
             {
@@ -80,7 +86,6 @@
                     "Timer has been canceled");
                 return;
             }
-            auto& [sensorName, dwell, timer] = getDetails(sensor);
             commit(sensorName, timestamp, value);
             dwell = false;
         });
@@ -95,3 +100,9 @@
         action->commit(sensorName, timestamp, value);
     }
 }
+
+LabeledThresholdParam DiscreteThreshold::getThresholdParam() const
+{
+    return discrete::LabeledThresholdParam(name, severity, dwellTime.count(),
+                                           std::to_string(thresholdValue));
+}
