diff --git a/dbus/dbuspassive.cpp b/dbus/dbuspassive.cpp
new file mode 100644
index 0000000..25a0148
--- /dev/null
+++ b/dbus/dbuspassive.cpp
@@ -0,0 +1,107 @@
+/**
+ * Copyright 2017 Google Inc.
+ *
+ * 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 <chrono>
+#include <cmath>
+#include <mutex>
+
+#include "dbuspassive.hpp"
+
+DbusPassive::DbusPassive(
+    sdbusplus::bus::bus& bus,
+    const std::string& type,
+    const std::string& id)
+    : ReadInterface(),
+      _bus(bus),
+      _signal(bus, GetMatch(type, id).c_str(), DbusHandleSignal, this),
+      _id(id)
+{
+    /* Need to get the scale and initial value */
+    auto tempBus = sdbusplus::bus::new_default();
+    /* service == busname */
+    std::string path = GetSensorPath(type, id);
+    std::string service = GetService(tempBus, sensorintf, path);
+
+    struct SensorProperties settings;
+    GetProperties(tempBus, service, path, &settings);
+
+    _scale = settings.scale;
+    _value = settings.value * pow(10, _scale);
+    _updated = std::chrono::high_resolution_clock::now();
+}
+
+ReadReturn DbusPassive::read(void)
+{
+    std::lock_guard<std::mutex> guard(_lock);
+
+    struct ReadReturn r = {
+        _value,
+        _updated
+    };
+
+    return r;
+}
+
+void DbusPassive::setValue(double value)
+{
+    std::lock_guard<std::mutex> guard(_lock);
+
+    _value = value;
+    _updated = std::chrono::high_resolution_clock::now();
+}
+
+int64_t DbusPassive::getScale(void)
+{
+    return _scale;
+}
+
+std::string DbusPassive::getId(void)
+{
+    return _id;
+}
+
+int DbusHandleSignal(sd_bus_message* msg, void* usrData, sd_bus_error* err)
+{
+    namespace sdm = sdbusplus::message;
+    auto sdbpMsg = sdm::message(msg);
+    DbusPassive* obj = static_cast<DbusPassive*>(usrData);
+
+    std::string msgSensor;
+    std::map<std::string, sdm::variant<int64_t>> msgData;
+    sdbpMsg.read(msgSensor, msgData);
+
+    if (msgSensor == "xyz.openbmc_project.Sensor.Value")
+    {
+        auto valPropMap = msgData.find("Value");
+        if (valPropMap != msgData.end())
+        {
+            int64_t rawValue = sdm::variant_ns::get<int64_t>
+                               (valPropMap->second);
+
+            double value = rawValue * pow(10, obj->getScale());
+
+#if 0
+            std::cerr << "received update: " << value
+                      << " for: " << obj->getId()
+                      << std::endl;
+#endif
+
+            obj->setValue(value);
+        }
+    }
+
+    return 0;
+}
