diff --git a/tests/src/mocks/trigger_factory_mock.hpp b/tests/src/mocks/trigger_factory_mock.hpp
index 8249799..3682a46 100644
--- a/tests/src/mocks/trigger_factory_mock.hpp
+++ b/tests/src/mocks/trigger_factory_mock.hpp
@@ -3,6 +3,8 @@
 #include "interfaces/trigger_factory.hpp"
 #include "mocks/trigger_mock.hpp"
 #include "params/trigger_params.hpp"
+#include "trigger.hpp"
+#include "utils/conversion_trigger.hpp"
 
 #include <gmock/gmock.h>
 
@@ -13,26 +15,28 @@
     {
         using namespace testing;
 
-        ON_CALL(*this, make(_, _, _, _, _, _, _, _, _, _, _))
-            .WillByDefault(WithArgs<1>(Invoke([](const std::string& name) {
+        ON_CALL(*this, make(A<const std::string&>(), _, _, _, _, _, _, _, _, _))
+            .WillByDefault(WithArgs<0>(Invoke([](const std::string& name) {
                 return std::make_unique<NiceMock<TriggerMock>>(name);
             })));
     }
 
-    MOCK_METHOD(
-        std::unique_ptr<interfaces::Trigger>, make,
-        (boost::asio::yield_context&, const std::string& name, bool isDiscrete,
-         bool logToJournal, bool logToRedfish, bool updateReport,
-         (const std::vector<
-             std::pair<sdbusplus::message::object_path, std::string>>& sensors),
-         const std::vector<std::string>& reportNames,
-         const TriggerThresholdParams& thresholdParams,
-         interfaces::TriggerManager& triggerManager,
-         interfaces::JsonStorage& triggerStorage),
-        (const, override));
+    MOCK_METHOD(std::unique_ptr<interfaces::Trigger>, make,
+                (const std::string& name, bool isDiscrete, bool logToJournal,
+                 bool logToRedfish, bool updateReport,
+                 const std::vector<std::string>& reportNames,
+                 interfaces::TriggerManager& triggerManager,
+                 interfaces::JsonStorage& triggerStorage,
+                 const LabeledTriggerThresholdParams& labeledThresholdParams,
+                 const std::vector<LabeledSensorInfo>& labeledSensorsInfo),
+                (const, override));
+
+    MOCK_METHOD(std::vector<LabeledSensorInfo>, getLabeledSensorsInfo,
+                (boost::asio::yield_context&, const SensorsInfo&),
+                (const, override));
 
     auto& expectMake(
-        std::optional<std::reference_wrapper<const TriggerParams>> paramsOpt,
+        std::optional<TriggerParams> paramsOpt,
         const testing::Matcher<interfaces::TriggerManager&>& tm,
         const testing::Matcher<interfaces::JsonStorage&>& triggerStorage)
     {
@@ -41,17 +45,32 @@
         if (paramsOpt)
         {
             const TriggerParams& params = *paramsOpt;
+
+            const auto sensorInfos =
+                utils::fromLabeledSensorsInfo(params.sensors());
+
+            ON_CALL(*this, getLabeledSensorsInfo(_, sensorInfos))
+                .WillByDefault(Return(params.sensors()));
+
             return EXPECT_CALL(
-                *this, make(_, params.name(), params.isDiscrete(),
-                            params.logToJournal(), params.logToRedfish(),
-                            params.updateReport(), params.sensors(),
-                            params.reportNames(), params.thresholdParams(), tm,
-                            triggerStorage));
+                *this,
+                make(params.name(), params.isDiscrete(), params.logToJournal(),
+                     params.logToRedfish(), params.updateReport(),
+                     params.reportNames(), tm, triggerStorage,
+                     params.thresholdParams(), params.sensors()));
         }
         else
         {
+            const std::vector<LabeledSensorInfo> dummy = {
+                {"service99",
+                 "/xyz/openbmc_project/sensors/temperature/BMC_Temp99",
+                 "metadata99"}};
+
+            ON_CALL(*this, getLabeledSensorsInfo(_, _))
+                .WillByDefault(Return(dummy));
+
             return EXPECT_CALL(
-                *this, make(_, _, _, _, _, _, _, _, _, tm, triggerStorage));
+                *this, make(_, _, _, _, _, _, tm, triggerStorage, _, dummy));
         }
     }
 };
diff --git a/tests/src/params/trigger_params.hpp b/tests/src/params/trigger_params.hpp
index 08bed4b..7e00157 100644
--- a/tests/src/params/trigger_params.hpp
+++ b/tests/src/params/trigger_params.hpp
@@ -53,9 +53,9 @@
         return updateReportProperty;
     }
 
-    const TriggerSensors& sensors() const
+    const std::vector<LabeledSensorInfo>& sensors() const
     {
-        return sensorsProperty;
+        return labeledSensorsProperty;
     }
 
     const std::vector<std::string>& reportNames() const
@@ -63,15 +63,15 @@
         return reportNamesProperty;
     }
 
-    TriggerParams& thresholdParams(TriggerThresholdParams val)
+    TriggerParams& thresholdParams(LabeledTriggerThresholdParams val)
     {
-        thresholdsProperty = std::move(val);
+        labeledThresholdsProperty = std::move(val);
         return *this;
     }
 
-    const TriggerThresholdParams& thresholdParams() const
+    const LabeledTriggerThresholdParams& thresholdParams() const
     {
-        return thresholdsProperty;
+        return labeledThresholdsProperty;
     }
 
   private:
@@ -80,17 +80,20 @@
     bool logToJournalProperty = false;
     bool logToRedfishProperty = false;
     bool updateReportProperty = true;
-    TriggerSensors sensorsProperty = {
-        {sdbusplus::message::object_path(
-             "/xyz/openbmc_project/sensors/temperature/BMC_Temp"),
-         ""}};
+    std::vector<LabeledSensorInfo> labeledSensorsProperty = {
+        {"service1", "/xyz/openbmc_project/sensors/temperature/BMC_Temp",
+         "metadata1"}};
+
     std::vector<std::string> reportNamesProperty = {"Report1"};
-    TriggerThresholdParams thresholdsProperty =
-        std::vector<numeric::ThresholdParam>{
-            {numeric::typeToString(numeric::Type::lowerCritical),
-             std::chrono::milliseconds(10).count(),
-             numeric::directionToString(numeric::Direction::decreasing), 0.0},
-            {numeric::typeToString(numeric::Type::upperCritical),
-             std::chrono::milliseconds(10).count(),
-             numeric::directionToString(numeric::Direction::increasing), 90.0}};
+
+    LabeledTriggerThresholdParams labeledThresholdsProperty =
+        std::vector<numeric::LabeledThresholdParam>{
+            numeric::LabeledThresholdParam{
+                numeric::Type::lowerCritical,
+                std::chrono::milliseconds(10).count(),
+                numeric::Direction::decreasing, 0.5},
+            numeric::LabeledThresholdParam{
+                numeric::Type::upperCritical,
+                std::chrono::milliseconds(10).count(),
+                numeric::Direction::increasing, 90.2}};
 };
diff --git a/tests/src/test_trigger.cpp b/tests/src/test_trigger.cpp
index f396589..cf7d96c 100644
--- a/tests/src/test_trigger.cpp
+++ b/tests/src/test_trigger.cpp
@@ -4,7 +4,12 @@
 #include "mocks/trigger_manager_mock.hpp"
 #include "params/trigger_params.hpp"
 #include "trigger.hpp"
+#include "utils/conversion_trigger.hpp"
 #include "utils/set_exception.hpp"
+#include "utils/transform.hpp"
+#include "utils/tstring.hpp"
+
+#include <boost/range/combine.hpp>
 
 using namespace testing;
 using namespace std::literals::string_literals;
@@ -15,6 +20,18 @@
 {
   public:
     TriggerParams triggerParams;
+    TriggerParams triggerDiscreteParams =
+        TriggerParams()
+            .name("Trigger2")
+            .isDiscrete(true)
+            .thresholdParams(std::vector<discrete::LabeledThresholdParam>{
+                discrete::LabeledThresholdParam{
+                    "userId", discrete::Severity::warning,
+                    std::chrono::milliseconds(10).count(), 15.2},
+                discrete::LabeledThresholdParam{
+                    "userId_2", discrete::Severity::critical,
+                    std::chrono::milliseconds(5).count(), 32.7},
+            });
 
     std::unique_ptr<TriggerManagerMock> triggerManagerMockPtr =
         std::make_unique<NiceMock<TriggerManagerMock>>();
@@ -26,13 +43,22 @@
         sut = makeTrigger(triggerParams);
     }
 
+    static std::vector<LabeledSensorInfo>
+        convertToLabeledSensor(const SensorsInfo& sensorsInfo)
+    {
+        return utils::transform(sensorsInfo, [](const auto& sensorInfo) {
+            const auto& [sensorPath, sensorMetadata] = sensorInfo;
+            return LabeledSensorInfo("service1", sensorPath, sensorMetadata);
+        });
+    }
+
     std::unique_ptr<Trigger> makeTrigger(const TriggerParams& params)
     {
         return std::make_unique<Trigger>(
             DbusEnvironment::getIoc(), DbusEnvironment::getObjServer(),
             params.name(), params.isDiscrete(), params.logToJournal(),
-            params.logToRedfish(), params.updateReport(), params.sensors(),
-            params.reportNames(), params.thresholdParams(),
+            params.logToRedfish(), params.updateReport(), params.reportNames(),
+            params.sensors(), params.thresholdParams(),
             std::vector<std::shared_ptr<interfaces::Threshold>>{},
             *triggerManagerMockPtr, storageMock);
     }
@@ -104,16 +130,67 @@
                 Eq(triggerParams.logToRedfish()));
     EXPECT_THAT(getProperty<bool>(sut->getPath(), "UpdateReport"),
                 Eq(triggerParams.updateReport()));
-    EXPECT_THAT((getProperty<std::vector<
-                     std::pair<sdbusplus::message::object_path, std::string>>>(
-                    sut->getPath(), "Sensors")),
-                Eq(triggerParams.sensors()));
+    EXPECT_THAT((getProperty<SensorsInfo>(sut->getPath(), "Sensors")),
+                Eq(utils::fromLabeledSensorsInfo(triggerParams.sensors())));
     EXPECT_THAT(
         getProperty<std::vector<std::string>>(sut->getPath(), "ReportNames"),
         Eq(triggerParams.reportNames()));
     EXPECT_THAT(
         getProperty<TriggerThresholdParams>(sut->getPath(), "Thresholds"),
-        Eq(triggerParams.thresholdParams()));
+        Eq(std::visit(utils::FromLabeledThresholdParamConversion(),
+                      triggerParams.thresholdParams())));
+}
+
+TEST_F(TestTrigger, checkIfNumericCoversionsAreGood)
+{
+    const auto& labeledParamsBase =
+        std::get<std::vector<numeric::LabeledThresholdParam>>(
+            triggerParams.thresholdParams());
+    const auto paramsToCheck =
+        std::visit(utils::FromLabeledThresholdParamConversion(),
+                   triggerParams.thresholdParams());
+    const auto labeledParamsToCheck =
+        std::get<std::vector<numeric::LabeledThresholdParam>>(std::visit(
+            utils::ToLabeledThresholdParamConversion(), paramsToCheck));
+
+    for (const auto& [tocheck, base] :
+         boost::combine(labeledParamsToCheck, labeledParamsBase))
+    {
+        EXPECT_THAT(tocheck.at_label<utils::tstring::Type>(),
+                    Eq(base.at_label<utils::tstring::Type>()));
+        EXPECT_THAT(tocheck.at_label<utils::tstring::Direction>(),
+                    Eq(base.at_label<utils::tstring::Direction>()));
+        EXPECT_THAT(tocheck.at_label<utils::tstring::DwellTime>(),
+                    Eq(base.at_label<utils::tstring::DwellTime>()));
+        EXPECT_THAT(tocheck.at_label<utils::tstring::ThresholdValue>(),
+                    Eq(base.at_label<utils::tstring::ThresholdValue>()));
+    }
+}
+
+TEST_F(TestTrigger, checkIfDiscreteCoversionsAreGood)
+{
+    const auto& labeledParamsBase =
+        std::get<std::vector<discrete::LabeledThresholdParam>>(
+            triggerDiscreteParams.thresholdParams());
+    const auto paramsToCheck =
+        std::visit(utils::FromLabeledThresholdParamConversion(),
+                   triggerDiscreteParams.thresholdParams());
+    const auto labeledParamsToCheck =
+        std::get<std::vector<discrete::LabeledThresholdParam>>(std::visit(
+            utils::ToLabeledThresholdParamConversion(), paramsToCheck));
+
+    for (const auto& [tocheck, base] :
+         boost::combine(labeledParamsToCheck, labeledParamsBase))
+    {
+        EXPECT_THAT(tocheck.at_label<utils::tstring::UserId>(),
+                    Eq(base.at_label<utils::tstring::UserId>()));
+        EXPECT_THAT(tocheck.at_label<utils::tstring::Severity>(),
+                    Eq(base.at_label<utils::tstring::Severity>()));
+        EXPECT_THAT(tocheck.at_label<utils::tstring::DwellTime>(),
+                    Eq(base.at_label<utils::tstring::DwellTime>()));
+        EXPECT_THAT(tocheck.at_label<utils::tstring::ThresholdValue>(),
+                    Eq(base.at_label<utils::tstring::ThresholdValue>()));
+    }
 }
 
 TEST_F(TestTrigger, deleteTrigger)
@@ -130,12 +207,12 @@
     EXPECT_THAT(ec.value(), Eq(EBADR));
 }
 
-TEST_F(TestTrigger, settingPersistencyToFalseRemovesReportFromStorage)
+TEST_F(TestTrigger, settingPersistencyToFalseRemovesTriggerFromStorage)
 {
     EXPECT_CALL(storageMock, remove(to_file_path(sut->getName())));
 
     bool persistent = false;
-    EXPECT_THAT(setProperty(sut->getPath(), "Persistent", persistent).value(),
+    EXPECT_THAT(setProperty(sut->getPath(), "Persistent", persistent),
                 Eq(boost::system::errc::success));
     EXPECT_THAT(getProperty<bool>(sut->getPath(), "Persistent"),
                 Eq(persistent));
@@ -150,7 +227,7 @@
     nlohmann::json storedConfiguration;
 };
 
-TEST_F(TestTriggerErrors, throwingExceptionDoesNotStoreTriggerReportNames)
+TEST_F(TestTriggerErrors, exceptionDuringTriggerStoreDisablesPersistency)
 {
     EXPECT_CALL(storageMock, store(_, _))
         .WillOnce(Throw(std::runtime_error("Generic error!")));
@@ -171,15 +248,20 @@
 class TestTriggerStore : public TestTrigger
 {
   public:
+    nlohmann::json storedConfiguration;
+    nlohmann::json storedDiscreteConfiguration;
+    std::unique_ptr<Trigger> sutDiscrete;
+
     void SetUp() override
     {
         ON_CALL(storageMock, store(_, _))
             .WillByDefault(SaveArg<1>(&storedConfiguration));
-
         sut = makeTrigger(triggerParams);
-    }
 
-    nlohmann::json storedConfiguration;
+        ON_CALL(storageMock, store(_, _))
+            .WillByDefault(SaveArg<1>(&storedDiscreteConfiguration));
+        sutDiscrete = makeTrigger(triggerDiscreteParams);
+    }
 };
 
 TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerVersion)
@@ -225,29 +307,50 @@
 TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerSensors)
 {
     nlohmann::json expectedItem;
+    expectedItem["service"] = "service1";
     expectedItem["sensorPath"] =
         "/xyz/openbmc_project/sensors/temperature/BMC_Temp";
-    expectedItem["sensorMetadata"] = "";
+    expectedItem["sensorMetadata"] = "metadata1";
 
     ASSERT_THAT(storedConfiguration.at("Sensors"), ElementsAre(expectedItem));
 }
 
 TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerThresholdParams)
 {
-    ASSERT_THAT(storedConfiguration.at("ThresholdParamsDiscriminator"), Eq(0));
-
     nlohmann::json expectedItem0;
     expectedItem0["type"] = 0;
     expectedItem0["dwellTime"] = 10;
     expectedItem0["direction"] = 1;
-    expectedItem0["thresholdValue"] = 0.0;
+    expectedItem0["thresholdValue"] = 0.5;
 
     nlohmann::json expectedItem1;
     expectedItem1["type"] = 3;
     expectedItem1["dwellTime"] = 10;
     expectedItem1["direction"] = 2;
-    expectedItem1["thresholdValue"] = 90.0;
+    expectedItem1["thresholdValue"] = 90.2;
 
+    ASSERT_THAT(storedConfiguration.at("ThresholdParamsDiscriminator"), Eq(0));
     ASSERT_THAT(storedConfiguration.at("ThresholdParams"),
                 ElementsAre(expectedItem0, expectedItem1));
 }
+
+TEST_F(TestTriggerStore,
+       settingPersistencyToTrueStoresDiscreteTriggerThresholdParams)
+{
+    nlohmann::json expectedItem0;
+    expectedItem0["userId"] = "userId";
+    expectedItem0["severity"] = discrete::Severity::warning;
+    expectedItem0["dwellTime"] = 10;
+    expectedItem0["thresholdValue"] = 15.2;
+
+    nlohmann::json expectedItem1;
+    expectedItem1["userId"] = "userId_2";
+    expectedItem1["severity"] = discrete::Severity::critical;
+    expectedItem1["dwellTime"] = 5;
+    expectedItem1["thresholdValue"] = 32.7;
+
+    ASSERT_THAT(storedDiscreteConfiguration.at("ThresholdParamsDiscriminator"),
+                Eq(1));
+    ASSERT_THAT(storedDiscreteConfiguration.at("ThresholdParams"),
+                ElementsAre(expectedItem0, expectedItem1));
+}
diff --git a/tests/src/test_trigger_manager.cpp b/tests/src/test_trigger_manager.cpp
index 1bc4f1b..773b809 100644
--- a/tests/src/test_trigger_manager.cpp
+++ b/tests/src/test_trigger_manager.cpp
@@ -4,7 +4,10 @@
 #include "mocks/trigger_factory_mock.hpp"
 #include "mocks/trigger_mock.hpp"
 #include "params/trigger_params.hpp"
+#include "trigger.hpp"
 #include "trigger_manager.hpp"
+#include "utils/conversion_trigger.hpp"
+#include "utils/transform.hpp"
 
 using namespace testing;
 
@@ -14,6 +17,9 @@
     std::pair<boost::system::error_code, std::string>
         addTrigger(const TriggerParams& params)
     {
+        const auto sensorInfos =
+            utils::fromLabeledSensorsInfo(params.sensors());
+
         std::promise<std::pair<boost::system::error_code, std::string>>
             addTriggerPromise;
         DbusEnvironment::getBus()->async_method_call(
@@ -24,12 +30,25 @@
             DbusEnvironment::serviceName(), TriggerManager::triggerManagerPath,
             TriggerManager::triggerManagerIfaceName, "AddTrigger",
             params.name(), params.isDiscrete(), params.logToJournal(),
-            params.logToRedfish(), params.updateReport(), params.sensors(),
-            params.reportNames(), params.thresholdParams());
+            params.logToRedfish(), params.updateReport(), sensorInfos,
+            params.reportNames(),
+            std::visit(utils::FromLabeledThresholdParamConversion(),
+                       params.thresholdParams()));
         return DbusEnvironment::waitForFuture(addTriggerPromise.get_future());
     }
 
-    TriggerParams triggerParams;
+    std::unique_ptr<TriggerManager> makeTriggerManager()
+    {
+        return std::make_unique<TriggerManager>(
+            std::move(triggerFactoryMockPtr), std::move(storageMockPtr),
+            DbusEnvironment::getObjServer());
+    }
+
+    void SetUp() override
+    {
+        sut = makeTriggerManager();
+    }
+
     std::unique_ptr<StorageMock> storageMockPtr =
         std::make_unique<NiceMock<StorageMock>>();
     StorageMock& storageMock = *storageMockPtr;
@@ -37,20 +56,18 @@
         std::make_unique<NiceMock<TriggerFactoryMock>>();
     TriggerFactoryMock& triggerFactoryMock = *triggerFactoryMockPtr;
     std::unique_ptr<TriggerMock> triggerMockPtr =
-        std::make_unique<NiceMock<TriggerMock>>(triggerParams.name());
+        std::make_unique<NiceMock<TriggerMock>>(TriggerParams().name());
     TriggerMock& triggerMock = *triggerMockPtr;
-    std::unique_ptr<TriggerManager> sut = std::make_unique<TriggerManager>(
-        std::move(triggerFactoryMockPtr), std::move(storageMockPtr),
-        std::move(DbusEnvironment::getObjServer()));
+    std::unique_ptr<TriggerManager> sut;
     MockFunction<void(std::string)> checkPoint;
 };
 
 TEST_F(TestTriggerManager, addTrigger)
 {
-    triggerFactoryMock.expectMake(triggerParams, Ref(*sut), Ref(storageMock))
+    triggerFactoryMock.expectMake(TriggerParams(), Ref(*sut), Ref(storageMock))
         .WillOnce(Return(ByMove(std::move(triggerMockPtr))));
 
-    auto [ec, path] = addTrigger(triggerParams);
+    auto [ec, path] = addTrigger(TriggerParams());
     EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
     EXPECT_THAT(path, Eq(triggerMock.getPath()));
 }
@@ -58,13 +75,10 @@
 TEST_F(TestTriggerManager, addTriggerWithDiscreteThresholds)
 {
     TriggerParams triggerParamsDiscrete;
-    auto thresholds = std::vector<discrete::ThresholdParam>{
-        {"discrete_threshold1",
-         discrete::severityToString(discrete::Severity::ok), 10, 11.0},
-        {"discrete_threshold2",
-         discrete::severityToString(discrete::Severity::warning), 10, 12.0},
-        {"discrete_threshold3",
-         discrete::severityToString(discrete::Severity::critical), 10, 13.0}};
+    auto thresholds = std::vector<discrete::LabeledThresholdParam>{
+        {"discrete_threshold1", discrete::Severity::ok, 10, 11.0},
+        {"discrete_threshold2", discrete::Severity::warning, 10, 12.0},
+        {"discrete_threshold3", discrete::Severity::critical, 10, 13.0}};
 
     triggerParamsDiscrete.thresholdParams(thresholds).isDiscrete(true);
 
@@ -76,7 +90,7 @@
 TEST_F(TestTriggerManager, addDiscreteTriggerWithoutThresholds)
 {
     TriggerParams triggerParamsDiscrete;
-    auto thresholds = std::vector<discrete::ThresholdParam>();
+    auto thresholds = std::vector<discrete::LabeledThresholdParam>();
 
     triggerParamsDiscrete.thresholdParams(thresholds).isDiscrete(true);
 
@@ -87,30 +101,32 @@
 
 TEST_F(TestTriggerManager, DISABLED_failToAddTriggerTwice)
 {
-    triggerFactoryMock.expectMake(triggerParams, Ref(*sut), Ref(storageMock))
+    triggerFactoryMock.expectMake(TriggerParams(), Ref(*sut), Ref(storageMock))
         .WillOnce(Return(ByMove(std::move(triggerMockPtr))));
 
-    addTrigger(triggerParams);
+    addTrigger(TriggerParams());
 
-    auto [ec, path] = addTrigger(triggerParams);
+    auto [ec, path] = addTrigger(TriggerParams());
     EXPECT_THAT(ec.value(), Eq(boost::system::errc::file_exists));
     EXPECT_THAT(path, Eq(std::string()));
 }
 
 TEST_F(TestTriggerManager, DISABLED_failToAddTriggerWhenMaxTriggerIsReached)
 {
+    auto triggerParams = TriggerParams();
+
     triggerFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
         .Times(TriggerManager::maxTriggers);
 
     for (size_t i = 0; i < TriggerManager::maxTriggers; i++)
     {
-        triggerParams.name(triggerParams.name() + std::to_string(i));
+        triggerParams.name(TriggerParams().name() + std::to_string(i));
 
         auto [ec, path] = addTrigger(triggerParams);
         EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
     }
 
-    triggerParams.name(triggerParams.name() +
+    triggerParams.name(TriggerParams().name() +
                        std::to_string(TriggerManager::maxTriggers));
     auto [ec, path] = addTrigger(triggerParams);
     EXPECT_THAT(ec.value(), Eq(boost::system::errc::too_many_files_open));
@@ -122,13 +138,13 @@
     {
         InSequence seq;
         triggerFactoryMock
-            .expectMake(triggerParams, Ref(*sut), Ref(storageMock))
+            .expectMake(TriggerParams(), Ref(*sut), Ref(storageMock))
             .WillOnce(Return(ByMove(std::move(triggerMockPtr))));
         EXPECT_CALL(triggerMock, Die());
         EXPECT_CALL(checkPoint, Call("end"));
     }
 
-    addTrigger(triggerParams);
+    addTrigger(TriggerParams());
     sut->removeTrigger(&triggerMock);
     checkPoint.Call("end");
 }
@@ -150,14 +166,101 @@
     {
         InSequence seq;
         triggerFactoryMock
-            .expectMake(triggerParams, Ref(*sut), Ref(storageMock))
+            .expectMake(TriggerParams(), Ref(*sut), Ref(storageMock))
             .WillOnce(Return(ByMove(std::move(triggerMockPtr))));
         EXPECT_CALL(triggerMock, Die());
         EXPECT_CALL(checkPoint, Call("end"));
     }
 
-    addTrigger(triggerParams);
+    addTrigger(TriggerParams());
     sut->removeTrigger(&triggerMock);
     sut->removeTrigger(&triggerMock);
     checkPoint.Call("end");
 }
+
+class TestTriggerManagerStorage : public TestTriggerManager
+{
+  public:
+    using FilePath = interfaces::JsonStorage::FilePath;
+    using DirectoryPath = interfaces::JsonStorage::DirectoryPath;
+
+    void SetUp() override
+    {
+        ON_CALL(storageMock, list())
+            .WillByDefault(Return(std::vector<FilePath>{
+                {FilePath("trigger1")}, {FilePath("trigger2")}}));
+
+        ON_CALL(storageMock, load(FilePath("trigger1")))
+            .WillByDefault(InvokeWithoutArgs([this] { return data1; }));
+
+        data2["Name"] = "Trigger2";
+        ON_CALL(storageMock, load(FilePath("trigger2")))
+            .WillByDefault(InvokeWithoutArgs([this] { return data2; }));
+    }
+
+    nlohmann::json data1 = nlohmann::json{
+        {"Version", Trigger::triggerVersion},
+        {"Name", TriggerParams().name()},
+        {"ThresholdParamsDiscriminator",
+         TriggerParams().thresholdParams().index()},
+        {"IsDiscrete", TriggerParams().isDiscrete()},
+        {"LogToJournal", TriggerParams().logToJournal()},
+        {"LogToRedfish", TriggerParams().logToRedfish()},
+        {"UpdateReport", TriggerParams().updateReport()},
+        {"ThresholdParams", utils::labeledThresholdParamsToJson(
+                                TriggerParams().thresholdParams())},
+        {"ReportNames", TriggerParams().reportNames()},
+        {"Sensors", TriggerParams().sensors()}};
+
+    nlohmann::json data2 = data1;
+};
+
+TEST_F(TestTriggerManagerStorage, triggerManagerCtorAddTriggerFromStorage)
+{
+    triggerFactoryMock.expectMake(TriggerParams(), _, Ref(storageMock));
+    triggerFactoryMock.expectMake(TriggerParams().name("Trigger2"), _,
+                                  Ref(storageMock));
+    EXPECT_CALL(storageMock, remove(_)).Times(0);
+
+    sut = makeTriggerManager();
+}
+
+TEST_F(TestTriggerManagerStorage,
+       triggerManagerCtorRemoveDiscreteTriggerFromStorage)
+{
+    LabeledTriggerThresholdParams thresholdParams =
+        std::vector<discrete::LabeledThresholdParam>{
+            {"userId1", discrete::Severity::warning, 15, 10.0},
+            {"userId2", discrete::Severity::critical, 5, 20.0}};
+
+    data1["ThresholdParamsDiscriminator"] = thresholdParams.index();
+
+    data1["ThresholdParams"] =
+        utils::labeledThresholdParamsToJson(thresholdParams);
+
+    EXPECT_CALL(storageMock, remove(FilePath("trigger1"))).Times(0);
+
+    sut = makeTriggerManager();
+}
+
+TEST_F(TestTriggerManagerStorage,
+       triggerManagerCtorRemoveDiscreteTriggerFromStorage2)
+{
+    data1["IsDiscrete"] = true;
+
+    EXPECT_CALL(storageMock, remove(FilePath("trigger1"))).Times(0);
+
+    sut = makeTriggerManager();
+}
+
+TEST_F(TestTriggerManagerStorage,
+       triggerManagerCtorAddProperRemoveInvalidTriggerFromStorage)
+{
+    data1["Version"] = Trigger::triggerVersion - 1;
+
+    triggerFactoryMock.expectMake(TriggerParams().name("Trigger2"), _,
+                                  Ref(storageMock));
+    EXPECT_CALL(storageMock, remove(FilePath("trigger1")));
+
+    sut = makeTriggerManager();
+}
