diff --git a/control/json/actions/default_floor.cpp b/control/json/actions/default_floor.cpp
index 1f95ffa..81bbd41 100644
--- a/control/json/actions/default_floor.cpp
+++ b/control/json/actions/default_floor.cpp
@@ -22,7 +22,6 @@
 #include <nlohmann/json.hpp>
 
 #include <algorithm>
-#include <tuple>
 
 namespace phosphor::fan::control::json
 {
diff --git a/control/json/actions/missing_owner_target.cpp b/control/json/actions/missing_owner_target.cpp
new file mode 100644
index 0000000..3cbd8a1
--- /dev/null
+++ b/control/json/actions/missing_owner_target.cpp
@@ -0,0 +1,72 @@
+/**
+ * Copyright © 2021 IBM Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "missing_owner_target.hpp"
+
+#include "../manager.hpp"
+#include "../zone.hpp"
+#include "group.hpp"
+
+#include <fmt/format.h>
+
+#include <nlohmann/json.hpp>
+#include <phosphor-logging/log.hpp>
+
+#include <algorithm>
+
+namespace phosphor::fan::control::json
+{
+
+using json = nlohmann::json;
+using namespace phosphor::logging;
+
+MissingOwnerTarget::MissingOwnerTarget(const json& jsonObj) :
+    ActionBase(MissingOwnerTarget::name)
+{
+    setTarget(jsonObj);
+}
+
+void MissingOwnerTarget::run(Zone& zone, const Group& group)
+{
+    const auto& members = group.getMembers();
+    auto isMissingOwner =
+        std::any_of(members.begin(), members.end(),
+                    [&intf = group.getInterface()](const auto& member) {
+                        return !Manager::hasOwner(member, intf);
+                    });
+    if (isMissingOwner)
+    {
+        zone.setTarget(_target);
+    }
+    // Update group's fan control active allowed based on action results
+    zone.setActiveAllow(group.getName(), !isMissingOwner);
+}
+
+void MissingOwnerTarget::setTarget(const json& jsonObj)
+{
+    if (!jsonObj.contains("speed"))
+    {
+        log<level::ERR>(
+            fmt::format("Action {}: Missing required speed value", getName())
+                .c_str(),
+            entry("JSON=%s", jsonObj.dump().c_str()));
+        throw std::runtime_error(
+            fmt::format("Action {}: Missing required speed value", getName())
+                .c_str());
+    }
+    _target = jsonObj["speed"].get<uint64_t>();
+}
+
+} // namespace phosphor::fan::control::json
diff --git a/control/json/actions/missing_owner_target.hpp b/control/json/actions/missing_owner_target.hpp
new file mode 100644
index 0000000..35fb5a9
--- /dev/null
+++ b/control/json/actions/missing_owner_target.hpp
@@ -0,0 +1,84 @@
+/**
+ * Copyright © 2021 IBM Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include "../zone.hpp"
+#include "action.hpp"
+#include "group.hpp"
+
+#include <nlohmann/json.hpp>
+
+namespace phosphor::fan::control::json
+{
+
+using json = nlohmann::json;
+
+/**
+ * @class MissingOwnerTarget - Action to set a target when an owner is missing
+ *
+ * Sets the fans to a configured target when any service owner associated to the
+ * group is missing. Once all services are functional and providing all the
+ * group data again, active fan target changes are allowed.
+ */
+class MissingOwnerTarget :
+    public ActionBase,
+    public ActionRegister<MissingOwnerTarget>
+{
+  public:
+    /* Name of this action */
+    static constexpr auto name = "set_speed_on_missing_owner";
+
+    MissingOwnerTarget() = delete;
+    MissingOwnerTarget(const MissingOwnerTarget&) = delete;
+    MissingOwnerTarget(MissingOwnerTarget&&) = delete;
+    MissingOwnerTarget& operator=(const MissingOwnerTarget&) = delete;
+    MissingOwnerTarget& operator=(MissingOwnerTarget&&) = delete;
+    ~MissingOwnerTarget() = default;
+
+    /**
+     * @brief Set target on an owner missing
+     *
+     * @param[in] jsonObj - JSON containing the configured target to use
+     */
+    explicit MissingOwnerTarget(const json& jsonObj);
+
+    /**
+     * @brief Run the action
+     *
+     * Updates the services of the group, then determines if any of the
+     * services hosting the members of the group are not owned on dbus
+     * resulting in the zone's target being set/held at the configured target.
+     *
+     * @param[in] zone - Zone to run the action on
+     * @param[in] group - Group of dbus objects the action runs against
+     */
+    void run(Zone& zone, const Group& group) override;
+
+  private:
+    /* Target for this action */
+    uint64_t _target;
+
+    /**
+     * @brief Parse and set the target
+     *
+     * @param[in] jsonObj - JSON object for the action
+     *
+     * Sets the target to use when running the action
+     */
+    void setTarget(const json& jsonObj);
+};
+
+} // namespace phosphor::fan::control::json
