diff --git a/control/preconditions.cpp b/control/preconditions.cpp
index 6365d41..13f51db 100644
--- a/control/preconditions.cpp
+++ b/control/preconditions.cpp
@@ -23,21 +23,22 @@
 {
     return [pg = std::move(pg), sse = std::move(sse)](auto& zone, auto& group) {
         // Compare given precondition entries
-        auto precondState = std::all_of(pg.begin(), pg.end(),
-                                        [&zone](auto const& entry) {
-            try
-            {
-                return zone.getPropValueVariant(std::get<pcPathPos>(entry),
-                                                std::get<pcIntfPos>(entry),
-                                                std::get<pcPropPos>(entry)) ==
-                       std::get<pcValuePos>(entry);
-            }
-            catch (const std::out_of_range& oore)
-            {
-                // Default to property variants not equal when not found
-                return false;
-            }
-        });
+        auto precondState =
+            std::all_of(pg.begin(), pg.end(), [&zone](const auto& entry) {
+                try
+                {
+                    return zone.getPropValueVariant(
+                               std::get<pcPathPos>(entry),
+                               std::get<pcIntfPos>(entry),
+                               std::get<pcPropPos>(entry)) ==
+                           std::get<pcValuePos>(entry);
+                }
+                catch (const std::out_of_range& oore)
+                {
+                    // Default to property variants not equal when not found
+                    return false;
+                }
+            });
 
         if (precondState)
         {
@@ -45,7 +46,7 @@
                 "Preconditions passed, init the associated events",
                 entry("EVENT_COUNT=%u", sse.size()));
             // Init the events when all the precondition(s) are true
-            std::for_each(sse.begin(), sse.end(), [&zone](auto const& entry) {
+            std::for_each(sse.begin(), sse.end(), [&zone](const auto& entry) {
                 zone.initEvent(entry);
             });
         }
@@ -55,7 +56,7 @@
                 "Preconditions not met for events, events removed if present",
                 entry("EVENT_COUNT=%u", sse.size()));
             // Unsubscribe the events' signals when any precondition is false
-            std::for_each(sse.begin(), sse.end(), [&zone](auto const& entry) {
+            std::for_each(sse.begin(), sse.end(), [&zone](const auto& entry) {
                 zone.removeEvent(entry);
             });
             zone.setFullSpeed();
@@ -71,21 +72,22 @@
         // Set/update the services of the group
         zone.setServices(&group);
         const auto& services = zone.getGroupServices(&group);
-        auto precondState = std::any_of(
-            services.begin(), services.end(),
-            [](const auto& s) { return !std::get<hasOwnerPos>(s); });
+        auto precondState =
+            std::any_of(services.begin(), services.end(), [](const auto& s) {
+                return !std::get<hasOwnerPos>(s);
+            });
 
         if (precondState)
         {
             // Init the events when all the precondition(s) are true
-            std::for_each(sse.begin(), sse.end(), [&zone](auto const& entry) {
+            std::for_each(sse.begin(), sse.end(), [&zone](const auto& entry) {
                 zone.initEvent(entry);
             });
         }
         else
         {
             // Unsubscribe the events' signals when any precondition is false
-            std::for_each(sse.begin(), sse.end(), [&zone](auto const& entry) {
+            std::for_each(sse.begin(), sse.end(), [&zone](const auto& entry) {
                 zone.removeEvent(entry);
             });
         }
