diff --git a/control/triggers.cpp b/control/triggers.cpp
index 410732d..706fdc1 100644
--- a/control/triggers.cpp
+++ b/control/triggers.cpp
@@ -75,7 +75,7 @@
                 }
             }
         }
-        zone.addSignal(std::move(eventData), std::move(mPtr));
+        zone.addSignal(name, std::move(eventData), std::move(mPtr));
     };
 }
 
diff --git a/control/zone.cpp b/control/zone.cpp
index 3a0b48b..3077f08 100644
--- a/control/zone.cpp
+++ b/control/zone.cpp
@@ -335,17 +335,18 @@
 
 void Zone::removeEvent(const SetSpeedEvent& event)
 {
-    // Remove triggers of the event
-    for (auto& trig : std::get<triggerPos>(event))
+    // Remove event signals
+    auto sigIter = _signalEvents.find(std::get<sseNamePos>(event));
+    if (sigIter != _signalEvents.end())
     {
-        auto it = findSignal(trig,
-                             std::get<groupPos>(event),
-                             std::get<actionsPos>(event));
-        if (it != std::end(getSignalEvents()))
+        auto& signals = sigIter->second;
+        for (auto it = signals.begin(); it != signals.end(); ++it)
         {
             removeSignal(it);
         }
+        _signalEvents.erase(sigIter);
     }
+
     // Remove timers of the event
     auto it = findTimer(std::get<groupPos>(event),
                         std::get<actionsPos>(event));
@@ -355,39 +356,6 @@
     }
 }
 
-std::vector<SignalEvent>::iterator Zone::findSignal(
-        const Trigger& signal,
-        const Group& eGroup,
-        const std::vector<Action>& eActions)
-{
-    // Find the signal in the event to be removed
-    for (auto it = _signalEvents.begin(); it != _signalEvents.end(); ++ it)
-    {
-        const auto& seEventData = *std::get<signalEventDataPos>(*it);
-        if (eGroup == std::get<eventGroupPos>(seEventData) &&
-            eActions.size() == std::get<eventActionsPos>(seEventData).size())
-        {
-            // TODO openbmc/openbmc#2328 - Use the function target
-            // for comparison
-            auto actsEqual = [](auto const& a1,
-                                auto const& a2)
-                    {
-                        return a1.target_type().name() ==
-                               a2.target_type().name();
-                    };
-            if (std::equal(eActions.begin(),
-                           eActions.end(),
-                           std::get<eventActionsPos>(seEventData).begin(),
-                           actsEqual))
-            {
-                return it;
-            }
-        }
-    }
-
-    return _signalEvents.end();
-}
-
 std::vector<TimerEvent>::iterator Zone::findTimer(
         const Group& eventGroup,
         const std::vector<Action>& eventActions)
diff --git a/control/zone.hpp b/control/zone.hpp
index 59f9743..e28e02b 100644
--- a/control/zone.hpp
+++ b/control/zone.hpp
@@ -412,43 +412,17 @@
         }
 
         /**
-         * @brief Get the list of signal events
-         *
-         * @return - List of signal events
-         */
-        inline auto& getSignalEvents()
-        {
-            return _signalEvents;
-        }
-
-        /**
-         * @brief Find the first instance of a signal event
-         *
-         * @param[in] signal - Event signal to find
-         * @param[in] eGroup - Group associated with the signal
-         * @param[in] eActions - List of actions associated with the signal
-         *
-         * @return - Iterator to the stored signal event
-         */
-        std::vector<SignalEvent>::iterator findSignal(
-            const Trigger& signal,
-            const Group& eGroup,
-            const std::vector<Action>& eActions);
-
-        /**
          * @brief Remove the given signal event
          *
          * @param[in] seIter - Iterator pointing to the signal event to remove
          */
         inline void removeSignal(std::vector<SignalEvent>::iterator& seIter)
         {
-            assert(seIter != std::end(_signalEvents));
             std::get<signalEventDataPos>(*seIter).reset();
             if (std::get<signalMatchPos>(*seIter) != nullptr)
             {
                 std::get<signalMatchPos>(*seIter).reset();
             }
-            _signalEvents.erase(seIter);
         }
 
         /**
@@ -544,14 +518,16 @@
         /**
          * @brief Add a signal to the list of signal based events
          *
+         * @param[in] name - Event name
          * @param[in] data - Event data for signal
          * @param[in] match - Subscribed signal match
          */
         inline void addSignal(
+                const std::string& name,
                 std::unique_ptr<EventData>&& data,
                 std::unique_ptr<sdbusplus::server::match::match>&& match)
         {
-            _signalEvents.emplace_back(std::move(data), std::move(match));
+            _signalEvents[name].emplace_back(std::move(data), std::move(match));
         }
 
         /**
@@ -793,9 +769,10 @@
                 std::vector<std::string>>> _servTree;
 
         /**
-         * @brief List of signal event arguments and Dbus matches for callbacks
+         * @brief List of signal event arguments and Dbus matches
+         * for callbacks per event name
          */
-        std::vector<SignalEvent> _signalEvents;
+        std::map<std::string, std::vector<SignalEvent>> _signalEvents;
 
         /**
          * @brief List of timers for events
