diff --git a/control/fan.cpp b/control/fan.cpp
new file mode 100644
index 0000000..550d34a
--- /dev/null
+++ b/control/fan.cpp
@@ -0,0 +1,90 @@
+/**
+ * Copyright © 2017 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 <phosphor-logging/log.hpp>
+#include <string>
+#include "fan.hpp"
+#include "utility.hpp"
+
+namespace phosphor
+{
+namespace fan
+{
+namespace control
+{
+
+constexpr auto PROPERTY_INTERFACE = "org.freedesktop.DBus.Properties";
+constexpr auto FAN_SENSOR_PATH = "/xyz/openbmc_project/sensors/fan_tach/";
+constexpr auto FAN_SENSOR_CONTROL_INTF = "xyz.openbmc_project.Control.FanSpeed";
+constexpr auto FAN_TARGET_PROPERTY = "Target";
+
+
+Fan::Fan(sdbusplus::bus::bus& bus, const FanDefinition& def):
+    _bus(bus),
+    _name(std::get<fanNamePos>(def))
+{
+    auto sensors = std::get<sensorListPos>(def);
+    for (auto& s : sensors)
+    {
+        _sensors.emplace_back(FAN_SENSOR_PATH + s);
+    }
+}
+
+
+//TODO openbmc/openbmc#1524  Can cache this value when
+//openbmc/openbmc#1496 is resolved.
+std::string Fan::getService(const std::string& sensor)
+{
+    return phosphor::fan::util::getService(sensor,
+                                           FAN_SENSOR_CONTROL_INTF,
+                                           _bus);
+}
+
+
+void Fan::setSpeed(uint64_t speed)
+{
+    sdbusplus::message::variant<uint64_t> value = speed;
+    std::string property{FAN_TARGET_PROPERTY};
+
+    for (auto& sensor : _sensors)
+    {
+        try
+        {
+            auto service = getService(sensor);
+
+            auto method = _bus.new_method_call(service.c_str(),
+                                               sensor.c_str(),
+                                               PROPERTY_INTERFACE,
+                                               "Set");
+            method.append(FAN_SENSOR_CONTROL_INTF, property, value);
+
+            auto response = _bus.call(method);
+            if (response.is_method_error())
+            {
+                throw std::runtime_error(
+                    "Failed call to set fan speed on " + sensor);
+            }
+        }
+        catch (std::exception& e)
+        {
+            //Other applications will handle reporting errors for this
+            phosphor::logging::log<phosphor::logging::level::INFO>(e.what());
+        }
+    }
+}
+
+}
+}
+}
