diff --git a/Makefile.am b/Makefile.am
index d93b6da..6325121 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -10,6 +10,7 @@
 	argument.cpp \
 	directory.cpp \
 	sensorset.cpp \
-	mainloop.cpp
+	mainloop.cpp \
+	xyz.openbmc_project.Sensor.Value.cpp
 
 SUBDIRS = . test
diff --git a/xyz.openbmc_project.Sensor.Value.cpp b/xyz.openbmc_project.Sensor.Value.cpp
new file mode 100644
index 0000000..30d0766
--- /dev/null
+++ b/xyz.openbmc_project.Sensor.Value.cpp
@@ -0,0 +1,316 @@
+#include <algorithm>
+#include <sdbusplus/server.hpp>
+#include <sdbusplus/exception.hpp>
+#include <xyz/openbmc_project/Sensor/Value/server.hpp>
+
+namespace sdbusplus
+{
+namespace xyz
+{
+namespace openbmc_project
+{
+namespace Sensor
+{
+namespace server
+{
+
+Value::Value(bus::bus& bus, const char* path)
+        : _xyz_openbmc_project_Sensor_Value_interface(
+                bus, path, _interface, _vtable, this)
+{
+}
+
+
+
+auto Value::value() const ->
+        int64_t
+{
+    return _value;
+}
+
+int Value::_callback_get_Value(
+        sd_bus* bus, const char* path, const char* interface,
+        const char* property, sd_bus_message* reply, void* context,
+        sd_bus_error* error)
+{
+    using sdbusplus::server::binding::details::convertForMessage;
+
+    try
+    {
+        auto m = message::message(sd_bus_message_ref(reply));
+
+        auto o = static_cast<Value*>(context);
+        m.append(convertForMessage(o->value()));
+    }
+    catch(sdbusplus::internal_exception_t& e)
+    {
+        sd_bus_error_set_const(error, e.name(), e.description());
+        return -EINVAL;
+    }
+
+    return true;
+}
+
+auto Value::value(int64_t value) ->
+        int64_t
+{
+    if (_value != value)
+    {
+        _value = value;
+        _xyz_openbmc_project_Sensor_Value_interface.property_changed("Value");
+    }
+
+    return _value;
+}
+
+int Value::_callback_set_Value(
+        sd_bus* bus, const char* path, const char* interface,
+        const char* property, sd_bus_message* value, void* context,
+        sd_bus_error* error)
+{
+    try
+    {
+        auto m = message::message(sd_bus_message_ref(value));
+
+        auto o = static_cast<Value*>(context);
+
+        int64_t v{};
+        m.read(v);
+        o->value(v);
+    }
+    catch(sdbusplus::internal_exception_t& e)
+    {
+        sd_bus_error_set_const(error, e.name(), e.description());
+        return -EINVAL;
+    }
+
+    return true;
+}
+
+namespace details
+{
+namespace Value
+{
+static const auto _property_Value =
+    utility::tuple_to_array(message::types::type_id<
+            int64_t>());
+}
+}
+auto Value::unit() const ->
+        Unit
+{
+    return _unit;
+}
+
+int Value::_callback_get_Unit(
+        sd_bus* bus, const char* path, const char* interface,
+        const char* property, sd_bus_message* reply, void* context,
+        sd_bus_error* error)
+{
+    using sdbusplus::server::binding::details::convertForMessage;
+
+    try
+    {
+        auto m = message::message(sd_bus_message_ref(reply));
+
+        auto o = static_cast<Value*>(context);
+        m.append(convertForMessage(o->unit()));
+    }
+    catch(sdbusplus::internal_exception_t& e)
+    {
+        sd_bus_error_set_const(error, e.name(), e.description());
+        return -EINVAL;
+    }
+
+    return true;
+}
+
+auto Value::unit(Unit value) ->
+        Unit
+{
+    if (_unit != value)
+    {
+        _unit = value;
+        _xyz_openbmc_project_Sensor_Value_interface.property_changed("Unit");
+    }
+
+    return _unit;
+}
+
+int Value::_callback_set_Unit(
+        sd_bus* bus, const char* path, const char* interface,
+        const char* property, sd_bus_message* value, void* context,
+        sd_bus_error* error)
+{
+    try
+    {
+        auto m = message::message(sd_bus_message_ref(value));
+
+        auto o = static_cast<Value*>(context);
+
+        std::string v{};
+        m.read(v);
+        o->unit(convertUnitFromString(v));
+    }
+    catch(sdbusplus::internal_exception_t& e)
+    {
+        sd_bus_error_set_const(error, e.name(), e.description());
+        return -EINVAL;
+    }
+
+    return true;
+}
+
+namespace details
+{
+namespace Value
+{
+static const auto _property_Unit =
+    utility::tuple_to_array(message::types::type_id<
+            std::string>());
+}
+}
+auto Value::scale() const ->
+        int64_t
+{
+    return _scale;
+}
+
+int Value::_callback_get_Scale(
+        sd_bus* bus, const char* path, const char* interface,
+        const char* property, sd_bus_message* reply, void* context,
+        sd_bus_error* error)
+{
+    using sdbusplus::server::binding::details::convertForMessage;
+
+    try
+    {
+        auto m = message::message(sd_bus_message_ref(reply));
+
+        auto o = static_cast<Value*>(context);
+        m.append(convertForMessage(o->scale()));
+    }
+    catch(sdbusplus::internal_exception_t& e)
+    {
+        sd_bus_error_set_const(error, e.name(), e.description());
+        return -EINVAL;
+    }
+
+    return true;
+}
+
+auto Value::scale(int64_t value) ->
+        int64_t
+{
+    if (_scale != value)
+    {
+        _scale = value;
+        _xyz_openbmc_project_Sensor_Value_interface.property_changed("Scale");
+    }
+
+    return _scale;
+}
+
+int Value::_callback_set_Scale(
+        sd_bus* bus, const char* path, const char* interface,
+        const char* property, sd_bus_message* value, void* context,
+        sd_bus_error* error)
+{
+    try
+    {
+        auto m = message::message(sd_bus_message_ref(value));
+
+        auto o = static_cast<Value*>(context);
+
+        int64_t v{};
+        m.read(v);
+        o->scale(v);
+    }
+    catch(sdbusplus::internal_exception_t& e)
+    {
+        sd_bus_error_set_const(error, e.name(), e.description());
+        return -EINVAL;
+    }
+
+    return true;
+}
+
+namespace details
+{
+namespace Value
+{
+static const auto _property_Scale =
+    utility::tuple_to_array(message::types::type_id<
+            int64_t>());
+}
+}
+
+
+namespace
+{
+/** String to enum mapping for Value::Unit */
+static const std::tuple<const char*, Value::Unit> mappingValueUnit[] =
+        {
+            std::make_tuple( "xyz.openbmc_project.Sensor.Value.Unit.DegreesC",                 Value::Unit::DegreesC ),
+            std::make_tuple( "xyz.openbmc_project.Sensor.Value.Unit.RPMS",                 Value::Unit::RPMS ),
+            std::make_tuple( "xyz.openbmc_project.Sensor.Value.Unit.Volts",                 Value::Unit::Volts ),
+            std::make_tuple( "xyz.openbmc_project.Sensor.Value.Unit.Meters",                 Value::Unit::Meters ),
+        };
+
+} // anonymous namespace
+
+auto Value::convertUnitFromString(std::string& s) ->
+        Unit
+{
+    auto i = std::find_if(
+            std::begin(mappingValueUnit),
+            std::end(mappingValueUnit),
+            [&s](auto& e){ return 0 == strcmp(s.c_str(), std::get<0>(e)); } );
+    if (std::end(mappingValueUnit) == i)
+    {
+        throw sdbusplus::exception::InvalidEnumString();
+    }
+    else
+    {
+        return std::get<1>(*i);
+    }
+}
+
+std::string convertForMessage(Value::Unit v)
+{
+    auto i = std::find_if(
+            std::begin(mappingValueUnit),
+            std::end(mappingValueUnit),
+            [v](auto& e){ return v == std::get<1>(e); });
+    return std::get<0>(*i);
+}
+
+const vtable::vtable_t Value::_vtable[] = {
+    vtable::start(),
+    vtable::property("Value",
+                     details::Value::_property_Value
+                        .data(),
+                     _callback_get_Value,
+                     _callback_set_Value,
+                     vtable::property_::emits_change),
+    vtable::property("Unit",
+                     details::Value::_property_Unit
+                        .data(),
+                     _callback_get_Unit,
+                     _callback_set_Unit,
+                     vtable::property_::emits_change),
+    vtable::property("Scale",
+                     details::Value::_property_Scale
+                        .data(),
+                     _callback_get_Scale,
+                     _callback_set_Scale,
+                     vtable::property_::emits_change),
+    vtable::end()
+};
+
+} // namespace server
+} // namespace Sensor
+} // namespace openbmc_project
+} // namespace xyz
+} // namespace sdbusplus
+
diff --git a/xyz/openbmc_project/Sensor/Value/server.hpp b/xyz/openbmc_project/Sensor/Value/server.hpp
new file mode 100644
index 0000000..00d49e1
--- /dev/null
+++ b/xyz/openbmc_project/Sensor/Value/server.hpp
@@ -0,0 +1,127 @@
+#pragma once
+#include <tuple>
+#include <systemd/sd-bus.h>
+#include <sdbusplus/server.hpp>
+
+namespace sdbusplus
+{
+namespace xyz
+{
+namespace openbmc_project
+{
+namespace Sensor
+{
+namespace server
+{
+
+class Value
+{
+    public:
+        /* Define all of the basic class operations:
+         *     Not allowed:
+         *         - Default constructor to avoid nullptrs.
+         *         - Copy operations due to internal unique_ptr.
+         *     Allowed:
+         *         - Move operations.
+         *         - Destructor.
+         */
+        Value() = delete;
+        Value(const Value&) = delete;
+        Value& operator=(const Value&) = delete;
+        Value(Value&&) = default;
+        Value& operator=(Value&&) = default;
+        virtual ~Value() = default;
+
+        /** @brief Constructor to put object onto bus at a dbus path.
+         *  @param[in] bus - Bus to attach to.
+         *  @param[in] path - Path to attach at.
+         */
+        Value(bus::bus& bus, const char* path);
+
+        enum class Unit
+        {
+            DegreesC,
+            RPMS,
+            Volts,
+            Meters,
+        };
+
+
+
+        /** Get value of Value */
+        virtual int64_t value() const;
+        /** Set value of Value */
+        virtual int64_t value(int64_t value);
+        /** Get value of Unit */
+        virtual Unit unit() const;
+        /** Set value of Unit */
+        virtual Unit unit(Unit value);
+        /** Get value of Scale */
+        virtual int64_t scale() const;
+        /** Set value of Scale */
+        virtual int64_t scale(int64_t value);
+
+    /** @brief Convert a string to an appropriate enum value.
+     *  @param[in] s - The string to convert in the form of
+     *                 "xyz.openbmc_project.Sensor.Value.<value name>"
+     *  @return - The enum value.
+     */
+    static Unit convertUnitFromString(std::string& s);
+
+    private:
+
+        /** @brief sd-bus callback for get-property 'Value' */
+        static int _callback_get_Value(
+            sd_bus*, const char*, const char*, const char*,
+            sd_bus_message*, void*, sd_bus_error*);
+        /** @brief sd-bus callback for set-property 'Value' */
+        static int _callback_set_Value(
+            sd_bus*, const char*, const char*, const char*,
+            sd_bus_message*, void*, sd_bus_error*);
+
+        /** @brief sd-bus callback for get-property 'Unit' */
+        static int _callback_get_Unit(
+            sd_bus*, const char*, const char*, const char*,
+            sd_bus_message*, void*, sd_bus_error*);
+        /** @brief sd-bus callback for set-property 'Unit' */
+        static int _callback_set_Unit(
+            sd_bus*, const char*, const char*, const char*,
+            sd_bus_message*, void*, sd_bus_error*);
+
+        /** @brief sd-bus callback for get-property 'Scale' */
+        static int _callback_get_Scale(
+            sd_bus*, const char*, const char*, const char*,
+            sd_bus_message*, void*, sd_bus_error*);
+        /** @brief sd-bus callback for set-property 'Scale' */
+        static int _callback_set_Scale(
+            sd_bus*, const char*, const char*, const char*,
+            sd_bus_message*, void*, sd_bus_error*);
+
+
+        static constexpr auto _interface = "xyz.openbmc_project.Sensor.Value";
+        static const vtable::vtable_t _vtable[];
+        sdbusplus::server::interface::interface
+                _xyz_openbmc_project_Sensor_Value_interface;
+
+        int64_t _value{};
+        Unit _unit{};
+        int64_t _scale{};
+
+};
+
+/* Specialization of sdbusplus::server::bindings::details::convertForMessage
+ * for enum-type Value::Unit.
+ *
+ * This converts from the enum to a constant c-string representing the enum.
+ *
+ * @param[in] e - Enum value to convert.
+ * @return C-string representing the name for the enum value.
+ */
+std::string convertForMessage(Value::Unit e);
+
+} // namespace server
+} // namespace Sensor
+} // namespace openbmc_project
+} // namespace xyz
+} // namespace sdbusplus
+
