diff --git a/dbus-top/sensorhelper.cpp b/dbus-top/sensorhelper.cpp
new file mode 100644
index 0000000..3f8bba6
--- /dev/null
+++ b/dbus-top/sensorhelper.cpp
@@ -0,0 +1,130 @@
+// Copyright 2021 Google LLC
+//
+// 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 "sensorhelper.hpp"
+#include "main.hpp"
+
+#include <unistd.h>
+
+#include <cassert>
+#include <fstream>
+#include <functional>
+#include <sstream>
+#include <string>
+#include <vector>
+
+extern SensorSnapshot* g_sensor_snapshot;
+extern DBusConnectionSnapshot* g_connection_snapshot;
+
+std::vector<std::string> MySplit(const std::string& s)
+{
+    int idx = 0, prev_idx = 0;
+    std::vector<std::string> ret;
+    while (idx <= static_cast<int>(s.size()))
+    {
+        if (idx == static_cast<int>(s.size()) || s[idx] == '/')
+        {
+            if (idx > prev_idx)
+            {
+                ret.push_back(s.substr(prev_idx, idx - prev_idx));
+            }
+            prev_idx = idx + 1;
+        }
+        idx++;
+    }
+    return ret;
+}
+
+// Example: /xyz/openbmc_project/sensors/temperature/powerseq_temp
+bool IsSensorObjectPath(const std::string& s)
+{
+    std::vector<std::string> sections = MySplit(s);
+    if (sections.size() == 5 && sections[0] == "xyz" &&
+        sections[1] == "openbmc_project" && sections[2] == "sensors")
+    {
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+// Example: /xyz/openbmc_project/sensors/temperature/powerseq_temp/chassis
+bool IsSensorObjectPathWithAssociation(const std::string& s,
+                                       std::string* sensor_obj_path)
+{
+    std::vector<std::string> sections = MySplit(s);
+    if (sections.size() == 6)
+    {
+        size_t idx = s.rfind('/');
+        return IsSensorObjectPath(s.substr(0, idx));
+    }
+    else
+    {
+        return false;
+    }
+}
+
+bool IsUniqueName(const std::string& x)
+{
+    if (x.empty())
+        return false;
+    if (x[0] != ':')
+        return false;
+    if (x[0] == ':')
+    {
+        for (int i = 1; i < int(x.size()); i++)
+        {
+            const char ch = x[i];
+            if (ch >= '0' || ch <= '9')
+                continue;
+            else if (ch == '.')
+                continue;
+            else
+                return false;
+        }
+    }
+    return true;
+}
+
+std::vector<std::string> FindAllObjectPathsForService(
+    const std::string& service,
+    std::function<void(const std::string&, const std::vector<std::string>&)>
+        on_interface_cb)
+{
+    // Not available for PCAP replay, only valid with actual DBus capture
+    assert(false);
+}
+
+bool IsWhitespace(const char c)
+{
+    if (c == ' ' || c == '\r' || c == '\n')
+        return true;
+    else
+        return false;
+}
+
+std::string Trim(const std::string& s)
+{
+    const int N = int(s.size());
+    int idx0 = 0, idx1 = int(N - 1);
+    while (idx0 < N && IsWhitespace(s[idx0]))
+        idx0++;
+    while (idx1 >= 0 && IsWhitespace(s[idx1]))
+        idx1--;
+    if (idx0 >= N || idx1 < 0)
+        return "";
+    return s.substr(idx0, idx1 - idx0 + 1);
+}
