diff --git a/control/json/event.cpp b/control/json/event.cpp
index ca94d9a..b5e986d 100644
--- a/control/json/event.cpp
+++ b/control/json/event.cpp
@@ -109,43 +109,11 @@
             value = getJsonValue(group["property"]["value"]);
         }
 
-        configKey key =
+        configKey eventProfile =
             std::make_pair(group["name"].get<std::string>(), _profiles);
-        auto grpEntry =
-            std::find_if(groups.begin(), groups.end(), [&key](const auto& grp) {
-                if (grp.first.first != key.first)
-                {
-                    return false;
-                }
-                // Groups with no profiles specified can be used in any event
-                if (grp.first.second.empty())
-                {
-                    return true;
-                }
-                else
-                {
-                    // Groups with profiles must have one match in the event's
-                    // profiles(and they must be an active profile) to be used
-                    // in the event
-                    return std::any_of(
-                        grp.first.second.begin(), grp.first.second.end(),
-                        [&key](const auto& grpProfile) {
-                            return std::any_of(
-                                key.second.begin(), key.second.end(),
-                                [&grpProfile](const auto& eventProfile) {
-                                    if (grpProfile != eventProfile)
-                                    {
-                                        return false;
-                                    }
-                                    auto activeProfs =
-                                        Manager::getActiveProfiles();
-                                    return std::find(activeProfs.begin(),
-                                                     activeProfs.end(),
-                                                     grpProfile) !=
-                                           activeProfs.end();
-                                });
-                        });
-                }
+        auto grpEntry = std::find_if(
+            groups.begin(), groups.end(), [&eventProfile](const auto& grp) {
+                return Manager::inConfig(grp.first, eventProfile);
             });
         if (grpEntry != groups.end())
         {
diff --git a/control/json/manager.cpp b/control/json/manager.cpp
index b1b5f91..64921fc 100644
--- a/control/json/manager.cpp
+++ b/control/json/manager.cpp
@@ -74,11 +74,12 @@
     auto fans = getConfig<Fan>(false, bus, bus);
     for (auto& fan : fans)
     {
-        auto itZone =
-            std::find_if(_zones.begin(), _zones.end(),
-                         [&fanZone = fan.second->getZone()](const auto& zone) {
-                             return fanZone == zone.second->getName();
-                         });
+        configKey fanProfile =
+            std::make_pair(fan.second->getZone(), fan.first.second);
+        auto itZone = std::find_if(
+            _zones.begin(), _zones.end(), [&fanProfile](const auto& zone) {
+                return Manager::inConfig(fanProfile, zone.first);
+            });
         if (itZone != _zones.end())
         {
             if (itZone->second->getTarget() != fan.second->getTarget() &&
@@ -105,6 +106,40 @@
     return _activeProfiles;
 }
 
+bool Manager::inConfig(const configKey& input, const configKey& comp)
+{
+    // Config names dont match, do not include in config
+    if (input.first != comp.first)
+    {
+        return false;
+    }
+    // No profiles specified by input config, can be used in any config
+    if (input.second.empty())
+    {
+        return true;
+    }
+    else
+    {
+        // Profiles must have one match in the other's profiles(and they must be
+        // an active profile) to be used in the config
+        return std::any_of(
+            input.second.begin(), input.second.end(),
+            [&comp](const auto& lProfile) {
+                return std::any_of(
+                    comp.second.begin(), comp.second.end(),
+                    [&lProfile](const auto& rProfile) {
+                        if (lProfile != rProfile)
+                        {
+                            return false;
+                        }
+                        auto activeProfs = getActiveProfiles();
+                        return std::find(activeProfs.begin(), activeProfs.end(),
+                                         lProfile) != activeProfs.end();
+                    });
+            });
+    }
+}
+
 bool Manager::hasOwner(const std::string& path, const std::string& intf)
 {
     auto itServ = _servTree.find(path);
diff --git a/control/json/manager.hpp b/control/json/manager.hpp
index 8ac48d1..d6a4499 100644
--- a/control/json/manager.hpp
+++ b/control/json/manager.hpp
@@ -168,6 +168,17 @@
     }
 
     /**
+     * @brief Check if the given input configuration key matches with another
+     * configuration key that it's to be included in
+     *
+     * @param[in] input - Config key to be included in another config object
+     * @param[in] comp - Config key of the config object to compare with
+     *
+     * @return Whether the configuration object should be included
+     */
+    static bool inConfig(const configKey& input, const configKey& comp);
+
+    /**
      * @brief Check if the given path and inteface is owned by a dbus service
      *
      * @param[in] path - Dbus object path
