diff --git a/Makefile.am b/Makefile.am
index 2ded4bf..cbe848d 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -7,4 +7,5 @@
 libhwmon_la_SOURCES = \
 	argument.cpp \
 	directory.cpp \
-	sensorset.cpp
+	sensorset.cpp \
+	mainloop.cpp
diff --git a/mainloop.cpp b/mainloop.cpp
new file mode 100644
index 0000000..6244b91
--- /dev/null
+++ b/mainloop.cpp
@@ -0,0 +1,73 @@
+/**
+ * Copyright © 2016 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 <iostream>
+#include <memory>
+#include <thread>
+#include "sensorset.hpp"
+#include "sensorcache.hpp"
+#include "hwmon.hpp"
+#include "sysfs.hpp"
+
+int serverMain(const char* path)
+{
+    // Check sysfs for available sensors.
+    auto sensors = std::make_unique<SensorSet>(path);
+    auto sensor_cache = std::make_unique<SensorCache>();
+
+    // TODO: Issue#3 - Need to make calls to the dbus sensor cache here to
+    //       ensure the objects all exist?
+
+    // Polling loop.
+    while (true)
+    {
+        // Iterate through all the sensors.
+        for (auto& i : *sensors)
+        {
+            if (i.second.find(hwmon::entry::input) != i.second.end())
+            {
+                // Read value from sensor.
+                int value = 0;
+                read_sysfs(make_sysfs_path(path,
+                                           i.first.first, i.first.second,
+                                           hwmon::entry::input),
+                           value);
+
+                // Update sensor cache.
+                if (sensor_cache->update(i.first, value))
+                {
+                    // TODO: Issue#4 - dbus event here.
+                    std::cout << i.first.first << i.first.second << " = "
+                              << value << std::endl;
+                }
+            }
+        }
+
+        // Sleep until next interval.
+        // TODO: Issue#5 - Make this configurable.
+        // TODO: Issue#6 - Optionally look at polling interval sysfs entry.
+        {
+            using namespace std::literals::chrono_literals;
+            std::this_thread::sleep_for(1s);
+        }
+
+        // TODO: Issue#7 - Should probably periodically check the SensorSet
+        //       for new entries.
+    }
+
+    return 0;
+}
+
+// vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
diff --git a/mainloop.hpp b/mainloop.hpp
new file mode 100644
index 0000000..d3a5f96
--- /dev/null
+++ b/mainloop.hpp
@@ -0,0 +1,3 @@
+#pragma once
+
+int serverMain(const char* path);
diff --git a/readd.cpp b/readd.cpp
index ed32b0a..1ac5ddc 100644
--- a/readd.cpp
+++ b/readd.cpp
@@ -15,12 +15,8 @@
  */
 #include <iostream>
 #include <memory>
-#include <thread>
 #include "argument.hpp"
-#include "sensorset.hpp"
-#include "sensorcache.hpp"
-#include "hwmon.hpp"
-#include "sysfs.hpp"
+#include "mainloop.hpp"
 
 static void exit_with_error(const char* err, char** argv)
 {
@@ -45,51 +41,7 @@
     // Finished getting options out, so cleanup the parser.
     options.reset();
 
-    // Check sysfs for available sensors.
-    auto sensors = std::make_unique<SensorSet>(path);
-    auto sensor_cache = std::make_unique<SensorCache>();
-
-    // TODO: Issue#3 - Need to make calls to the dbus sensor cache here to
-    //       ensure the objects all exist?
-
-    // Polling loop.
-    while (true)
-    {
-        // Iterate through all the sensors.
-        for (auto& i : *sensors)
-        {
-            if (i.second.find(hwmon::entry::input) != i.second.end())
-            {
-                // Read value from sensor.
-                int value = 0;
-                read_sysfs(make_sysfs_path(path,
-                                           i.first.first, i.first.second,
-                                           hwmon::entry::input),
-                           value);
-
-                // Update sensor cache.
-                if (sensor_cache->update(i.first, value))
-                {
-                    // TODO: Issue#4 - dbus event here.
-                    std::cout << i.first.first << i.first.second << " = "
-                              << value << std::endl;
-                }
-            }
-        }
-
-        // Sleep until next interval.
-        // TODO: Issue#5 - Make this configurable.
-        // TODO: Issue#6 - Optionally look at polling interval sysfs entry.
-        {
-            using namespace std::literals::chrono_literals;
-            std::this_thread::sleep_for(1s);
-        }
-
-        // TODO: Issue#7 - Should probably periodically check the SensorSet
-        //       for new entries.
-    }
-
-    return 0;
+    return serverMain(path.c_str());
 }
 
 // vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
