diff --git a/redfish-core/lib/trigger.hpp b/redfish-core/lib/trigger.hpp
index 047fbb7..c8559eb 100644
--- a/redfish-core/lib/trigger.hpp
+++ b/redfish-core/lib/trigger.hpp
@@ -37,10 +37,6 @@
 using DiscreteThresholdParams =
     std::tuple<std::string, std::string, uint64_t, std::string>;
 
-using TriggerThresholdParams =
-    std::variant<std::vector<NumericThresholdParams>,
-                 std::vector<DiscreteThresholdParams>>;
-
 using TriggerSensorsParams =
     std::vector<std::pair<sdbusplus::message::object_path, std::string>>;
 
@@ -204,8 +200,8 @@
     std::vector<std::pair<sdbusplus::message::object_path, std::string>>
         sensors;
     std::vector<sdbusplus::message::object_path> reports;
-    TriggerThresholdParams thresholds;
-
+    std::vector<NumericThresholdParams> numericThresholds;
+    std::vector<DiscreteThresholdParams> discreteThresholds;
     std::optional<DiscreteCondition> discreteCondition;
     std::optional<MetricType> metricType;
     std::optional<std::vector<std::string>> metricProperties;
@@ -361,7 +357,7 @@
         }
     }
 
-    ctx.thresholds = std::move(parsedParams);
+    ctx.numericThresholds = std::move(parsedParams);
     return true;
 }
 
@@ -373,7 +369,7 @@
     std::vector<DiscreteThresholdParams> parsedParams;
     if (!discreteTriggers)
     {
-        ctx.thresholds = std::move(parsedParams);
+        ctx.discreteThresholds = std::move(parsedParams);
         return true;
     }
 
@@ -416,7 +412,7 @@
                                   value);
     }
 
-    ctx.thresholds = std::move(parsedParams);
+    ctx.discreteThresholds = std::move(parsedParams);
     return true;
 }
 
@@ -730,19 +726,11 @@
     return triggerActions;
 }
 
-inline std::optional<nlohmann::json::array_t>
-    getDiscreteTriggers(const TriggerThresholdParams& thresholdParams)
+inline std::optional<nlohmann::json::array_t> getDiscreteTriggers(
+    const std::vector<DiscreteThresholdParams>& discreteParams)
 {
     nlohmann::json::array_t triggers;
-    const std::vector<DiscreteThresholdParams>* discreteParams =
-        std::get_if<std::vector<DiscreteThresholdParams>>(&thresholdParams);
-
-    if (discreteParams == nullptr)
-    {
-        return std::nullopt;
-    }
-
-    for (const auto& [name, severity, dwellTime, value] : *discreteParams)
+    for (const auto& [name, severity, dwellTime, value] : discreteParams)
     {
         std::optional<std::string> duration =
             time_utils::toDurationStringFromUint(dwellTime);
@@ -762,19 +750,12 @@
     return triggers;
 }
 
-inline std::optional<nlohmann::json>
-    getNumericThresholds(const TriggerThresholdParams& thresholdParams)
+inline std::optional<nlohmann::json::object_t> getNumericThresholds(
+    const std::vector<NumericThresholdParams>& numericParams)
 {
     nlohmann::json::object_t thresholds;
-    const std::vector<NumericThresholdParams>* numericParams =
-        std::get_if<std::vector<NumericThresholdParams>>(&thresholdParams);
 
-    if (numericParams == nullptr)
-    {
-        return std::nullopt;
-    }
-
-    for (const auto& [type, dwellTime, activation, reading] : *numericParams)
+    for (const auto& [type, dwellTime, activation, reading] : numericParams)
     {
         std::optional<std::string> duration =
             time_utils::toDurationStringFromUint(dwellTime);
@@ -840,12 +821,15 @@
     const TriggerSensorsParams* sensors = nullptr;
     const std::vector<sdbusplus::message::object_path>* reports = nullptr;
     const std::vector<std::string>* triggerActions = nullptr;
-    const TriggerThresholdParams* thresholds = nullptr;
+
+    const std::vector<DiscreteThresholdParams>* discreteThresholds = nullptr;
+    const std::vector<NumericThresholdParams>* numericThresholds = nullptr;
 
     const bool success = sdbusplus::unpackPropertiesNoThrow(
         dbus_utils::UnpackErrorPrinter(), properties, "Name", name, "Discrete",
         discrete, "Sensors", sensors, "Reports", reports, "TriggerActions",
-        triggerActions, "Thresholds", thresholds);
+        triggerActions, "DiscreteThresholds", discreteThresholds,
+        "NumericThresholds", numericThresholds);
 
     if (!success)
     {
@@ -877,42 +861,39 @@
         json["Links"]["MetricReportDefinitions"] = *linkedReports;
     }
 
-    if (discrete != nullptr)
+    if (discreteThresholds != nullptr)
     {
-        if (*discrete)
+        std::optional<nlohmann::json::array_t> discreteTriggers =
+            getDiscreteTriggers(*discreteThresholds);
+
+        if (!discreteTriggers)
         {
-            std::optional<nlohmann::json::array_t> discreteTriggers =
-                getDiscreteTriggers(*thresholds);
-
-            if (!discreteTriggers)
-            {
-                BMCWEB_LOG_ERROR("Property Thresholds is invalid for discrete "
-                                 "triggers in Trigger: {}",
-                                 id);
-                return false;
-            }
-
-            json["DiscreteTriggers"] = *discreteTriggers;
-            json["DiscreteTriggerCondition"] =
-                discreteTriggers->empty() ? "Changed" : "Specified";
-            json["MetricType"] = metric_definition::MetricType::Discrete;
+            BMCWEB_LOG_ERROR("Property Thresholds is invalid for discrete "
+                             "triggers in Trigger: {}",
+                             id);
+            return false;
         }
-        else
+
+        json["DiscreteTriggers"] = *discreteTriggers;
+        json["DiscreteTriggerCondition"] =
+            discreteTriggers->empty() ? "Changed" : "Specified";
+        json["MetricType"] = metric_definition::MetricType::Discrete;
+    }
+    if (numericThresholds != nullptr)
+    {
+        std::optional<nlohmann::json::object_t> jnumericThresholds =
+            getNumericThresholds(*numericThresholds);
+
+        if (!jnumericThresholds)
         {
-            std::optional<nlohmann::json> numericThresholds =
-                getNumericThresholds(*thresholds);
-
-            if (!numericThresholds)
-            {
-                BMCWEB_LOG_ERROR("Property Thresholds is invalid for numeric "
-                                 "thresholds in Trigger: {}",
-                                 id);
-                return false;
-            }
-
-            json["NumericThresholds"] = *numericThresholds;
-            json["MetricType"] = metric_definition::MetricType::Numeric;
+            BMCWEB_LOG_ERROR("Property Thresholds is invalid for numeric "
+                             "thresholds in Trigger: {}",
+                             id);
+            return false;
         }
+
+        json["NumericThresholds"] = *jnumericThresholds;
+        json["MetricType"] = metric_definition::MetricType::Numeric;
     }
 
     if (name != nullptr)
@@ -956,7 +937,7 @@
         service, "/xyz/openbmc_project/Telemetry/Triggers",
         "xyz.openbmc_project.Telemetry.TriggerManager", "AddTrigger",
         "TelemetryService/" + ctx.id, ctx.name, ctx.actions, ctx.sensors,
-        ctx.reports, ctx.thresholds);
+        ctx.reports, ctx.numericThresholds, ctx.discreteThresholds);
 }
 
 } // namespace telemetry
