diff --git a/Makefile.am b/Makefile.am
index ef4d98b..72698b7 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -9,6 +9,8 @@
 	$(PHOSPHOR_LOGGING_CFLAGS) \
 	$(SDBUSPLUS_CFLAGS)
 
-libpower_la_SOURCES = timer.cpp
+libpower_la_SOURCES = \
+	timer.cpp \
+	utility.cpp
 
 SUBDIRS = .
diff --git a/utility.cpp b/utility.cpp
new file mode 100644
index 0000000..8692518
--- /dev/null
+++ b/utility.cpp
@@ -0,0 +1,71 @@
+/**
+ * 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 "utility.hpp"
+
+namespace witherspoon
+{
+namespace power
+{
+namespace util
+{
+
+constexpr auto MAPPER_BUSNAME = "xyz.openbmc_project.ObjectMapper";
+constexpr auto MAPPER_PATH = "/xyz/openbmc_project/object_mapper";
+constexpr auto MAPPER_INTERFACE = "xyz.openbmc_project.ObjectMapper";
+
+using namespace phosphor::logging;
+
+std::string getService(const std::string& path,
+                       const std::string& interface,
+                       sdbusplus::bus::bus& bus)
+{
+    auto method = bus.new_method_call(MAPPER_BUSNAME,
+            MAPPER_PATH,
+            MAPPER_INTERFACE,
+            "GetObject");
+
+    method.append(path);
+    method.append(std::vector<std::string>({interface}));
+
+    auto reply = bus.call(method);
+    if (reply.is_method_error())
+    {
+        log<level::ERR>("Error in mapper call to get service name",
+                entry("PATH=%s", path.c_str()),
+                entry("INTERFACE=%s", interface.c_str()));
+
+        // TODO openbmc/openbmc#851 - Once available, throw returned error
+        throw std::runtime_error("Error in mapper call to get service name");
+    }
+
+    std::map<std::string, std::vector<std::string>> response;
+    reply.read(response);
+
+    if (response.empty())
+    {
+        log<level::ERR>(
+                "Error in mapper response for getting service name",
+                entry("PATH=%s", path.c_str()),
+                entry("INTERFACE=%s", interface.c_str()));
+        return std::string{};
+    }
+
+    return response.begin()->first;
+}
+
+}
+}
+}
diff --git a/utility.hpp b/utility.hpp
new file mode 100644
index 0000000..a4df0cb
--- /dev/null
+++ b/utility.hpp
@@ -0,0 +1,75 @@
+#pragma once
+
+#include <phosphor-logging/log.hpp>
+#include <sdbusplus/bus.hpp>
+#include <string>
+
+namespace witherspoon
+{
+namespace power
+{
+namespace util
+{
+
+constexpr auto PROPERTY_INTF = "org.freedesktop.DBus.Properties";
+
+/**
+ * @brief Get the service name from the mapper for the
+ *        interface and path passed in.
+ *
+ * @param[in] path - the D-Bus path name
+ * @param[in] interface - the D-Bus interface name
+ * @param[in] bus - the D-Bus object
+ *
+ * @return The service name
+ */
+std::string getService(const std::string& path,
+                       const std::string& interface,
+                       sdbusplus::bus::bus& bus);
+
+/**
+ * @brief Read a D-Bus property
+ *
+ * @param[in] interface - the interface the property is on
+ * @param[in] propertName - the name of the property
+ * @param[in] path - the D-Bus path
+ * @param[in] service - the D-Bus service
+ * @param[in] bus - the D-Bus object
+ * @param[out] value - filled in with the property value
+ */
+template<typename T>
+void getProperty(const std::string& interface,
+                 const std::string& propertyName,
+                 const std::string& path,
+                 const std::string& service,
+                 sdbusplus::bus::bus& bus,
+                 T& value)
+{
+    sdbusplus::message::variant<T> property;
+
+    auto method = bus.new_method_call(service.c_str(),
+            path.c_str(),
+            PROPERTY_INTF,
+            "Get");
+
+    method.append(interface, propertyName);
+
+    auto reply = bus.call(method);
+    if (reply.is_method_error())
+    {
+        using namespace phosphor::logging;
+        log<level::ERR>("Error in property get call",
+                entry("PATH=%s", path.c_str()),
+                entry("PROPERTY=%s", propertyName.c_str()));
+        //
+        // TODO openbmc/openbmc#851 - Once available, throw returned error
+        throw std::runtime_error("Error in property get call");
+    }
+
+    reply.read(property);
+    value = sdbusplus::message::variant_ns::get<T>(property);
+}
+
+}
+}
+}
