diff --git a/control/actions.cpp b/control/actions.cpp
index b1eb9be..6eda2a6 100644
--- a/control/actions.cpp
+++ b/control/actions.cpp
@@ -81,6 +81,24 @@
     };
 }
 
+void default_floor_on_missing_owner(Zone& zone, const Group& group)
+{
+    auto services = zone.getGroupServices(&group);
+    auto defFloor = std::any_of(
+        services.begin(),
+        services.end(),
+        [](const auto& s)
+        {
+            return !std::get<hasOwnerPos>(s);
+        });
+    if (defFloor)
+    {
+        zone.setFloor(zone.getDefFloor());
+    }
+    // Update fan control floor change allowed
+    zone.setFloorChangeAllow(&group, !defFloor);
+}
+
 void set_request_speed_base_with_max(control::Zone& zone,
                                      const Group& group)
 {
diff --git a/control/actions.hpp b/control/actions.hpp
index fff8250..4d2c5c3 100644
--- a/control/actions.hpp
+++ b/control/actions.hpp
@@ -30,6 +30,18 @@
         std::vector<Action>&& actions);
 
 /**
+ * @brief An action that sets the floor to the default fan floor speed
+ * @details Sets the fan floor to the defined default fan floor speed when a
+ * service associated to the given group has terminated. Once all services
+ * are functional and providing the sensors again, the fan floor is allowed
+ * to be set normally.
+ *
+ * @param[in] zone - Zone containing fans
+ * @param[in] group - Group of sensors to determine services' states
+ */
+void default_floor_on_missing_owner(Zone& zone, const Group& group);
+
+/**
  * @brief An action to set the request speed base
  * @details A new target speed is determined using a speed delta being added
  * or subtracted, for increases or decrease respectively, from a base speed.
diff --git a/control/zone.cpp b/control/zone.cpp
index 018f594..418b3ba 100644
--- a/control/zone.cpp
+++ b/control/zone.cpp
@@ -147,11 +147,19 @@
 
 void Zone::setFloor(uint64_t speed)
 {
-    _floorSpeed = speed;
-    // Floor speed above target, update target to floor speed
-    if (_targetSpeed < _floorSpeed)
+    // Check all entries are set to allow floor to be set
+    auto pred = [](auto const& entry) {return entry.second;};
+    auto setFloor = std::all_of(_floorChange.begin(),
+                                _floorChange.end(),
+                                pred);
+    if (setFloor)
     {
-        requestSpeedIncrease(_floorSpeed - _targetSpeed);
+        _floorSpeed = speed;
+        // Floor speed above target, update target to floor speed
+        if (_targetSpeed < _floorSpeed)
+        {
+            requestSpeedIncrease(_floorSpeed - _targetSpeed);
+        }
     }
 }
 
diff --git a/control/zone.hpp b/control/zone.hpp
index 1fdeaf2..fa3ed82 100644
--- a/control/zone.hpp
+++ b/control/zone.hpp
@@ -78,6 +78,17 @@
         void setActiveAllow(const Group* group, bool isActiveAllow);
 
         /**
+         * @brief Sets the floor change allowed state
+         *
+         * @param[in] group - A group that affects floor changes
+         * @param[in] isAllow - Allow state according to group
+         */
+        inline void setFloorChangeAllow(const Group* group, bool isAllow)
+        {
+            _floorChange[*(group)] = isAllow;
+        }
+
+        /**
          * @brief Sets a given object's property value
          *
          * @param[in] object - Name of the object containing the property
@@ -231,7 +242,8 @@
 
         /**
          * @brief Set the floor speed to the given speed and increase target
-         * speed to the floor when target is below floor.
+         * speed to the floor when target is below floor where floor changes
+         * are allowed.
          *
          * @param[in] speed - Speed to set the floor to
          */
@@ -454,6 +466,11 @@
         std::map<const Group, bool> _active;
 
         /**
+         * @brief Map of floor change allowed by groups
+         */
+        std::map<const Group, bool> _floorChange;
+
+        /**
          * @brief Map of group service names
          */
         std::map<const Group, std::vector<Service>> _services;
