diff --git a/sensors/builder.cpp b/sensors/builder.cpp
new file mode 100644
index 0000000..2786141
--- /dev/null
+++ b/sensors/builder.cpp
@@ -0,0 +1,153 @@
+/**
+ * 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 <iostream>
+
+/* Configuration. */
+#include "conf.hpp"
+
+#include "dbus/dbuspassive.hpp"
+#include "interfaces.hpp"
+#include "notimpl/readonly.hpp"
+#include "notimpl/writeonly.hpp"
+#include "sensors/builder.hpp"
+#include "sensors/manager.hpp"
+#include "sensors/host.hpp"
+#include "sensors/pluggable.hpp"
+#include "sysfs/sysfsread.hpp"
+#include "sysfs/sysfswrite.hpp"
+#include "util.hpp"
+
+static constexpr bool deferSignals = true;
+
+std::shared_ptr<SensorManager> BuildSensors(
+    const std::map<std::string, struct sensor>& config)
+{
+    auto mgmr = std::make_shared<SensorManager>();
+    auto& HostSensorBus = mgmr->getHostBus();
+    auto& PassiveListeningBus = mgmr->getPassiveBus();
+
+    for (auto& it : config)
+    {
+        std::unique_ptr<ReadInterface> ri;
+        std::unique_ptr<WriteInterface> wi;
+
+        std::string name = it.first;
+        const struct sensor* info = &it.second;
+
+        std::cerr << "Sensor: " << name << " " << info->type << " ";
+        std::cerr << info->readpath << " " << info->writepath << "\n";
+
+        IOInterfaceType rtype = GetReadInterfaceType(info->readpath);
+        IOInterfaceType wtype = GetWriteInterfaceType(info->writepath);
+
+        // fan sensors can be ready any way and written others.
+        // fan sensors are the only sensors this is designed to write.
+        // Nothing here should be write-only, although, in theory a fan could be.
+        // I'm just not sure how that would fit together.
+        // TODO(venture): It should check with the ObjectMapper to check if
+        // that sensor exists on the Dbus.
+        switch (rtype)
+        {
+            case IOInterfaceType::DBUSPASSIVE:
+                ri = std::make_unique<DbusPassive>(
+                         PassiveListeningBus,
+                         info->type,
+                         name);
+                break;
+            case IOInterfaceType::EXTERNAL:
+                // These are a special case for read-only.
+                break;
+            case IOInterfaceType::SYSFS:
+                ri = std::make_unique<SysFsRead>(info->readpath);
+                break;
+            default:
+                ri = std::make_unique<WriteOnly>();
+                break;
+        }
+
+        if (info->type == "fan")
+        {
+            switch (wtype)
+            {
+                case IOInterfaceType::SYSFS:
+                    if (info->max > 0)
+                    {
+                        wi = std::make_unique<SysFsWritePercent>(
+                                 info->writepath,
+                                 info->min,
+                                 info->max);
+                    }
+                    else
+                    {
+                        wi = std::make_unique<SysFsWrite>(
+                                 info->writepath,
+                                 info->min,
+                                 info->max);
+                    }
+
+                    break;
+                default:
+                    wi = std::make_unique<ReadOnlyNoExcept>();
+                    break;
+            }
+
+            auto sensor = std::make_unique<PluggableSensor>(
+                              name,
+                              info->timeout,
+                              std::move(ri),
+                              std::move(wi));
+            mgmr->addSensor(info->type, name, std::move(sensor));
+        }
+        else if (info->type == "temp" || info->type == "margin")
+        {
+            // These sensors are read-only, but only for this application
+            // which only writes to fan sensors.
+            std::cerr << info->type << " readpath: " << info->readpath << "\n";
+
+            if (IOInterfaceType::EXTERNAL == rtype)
+            {
+                std::cerr << "Creating HostSensor: " << name
+                          << " path: " << info->readpath << "\n";
+
+                /*
+                 * The reason we handle this as a HostSensor is because it's
+                 * not quite pluggable; but maybe it could be.
+                 */
+                auto sensor = HostSensor::CreateTemp(
+                                  name,
+                                  info->timeout,
+                                  HostSensorBus,
+                                  info->readpath.c_str(),
+                                  deferSignals);
+                mgmr->addSensor(info->type, name, std::move(sensor));
+            }
+            else
+            {
+                wi = std::make_unique<ReadOnlyNoExcept>();
+                auto sensor = std::make_unique<PluggableSensor>(
+                                  name,
+                                  info->timeout,
+                                  std::move(ri),
+                                  std::move(wi));
+                mgmr->addSensor(info->type, name, std::move(sensor));
+            }
+        }
+    }
+
+    return mgmr;
+}
+
diff --git a/sensors/builder.hpp b/sensors/builder.hpp
new file mode 100644
index 0000000..2849c71
--- /dev/null
+++ b/sensors/builder.hpp
@@ -0,0 +1,15 @@
+#pragma once
+
+#include <map>
+#include <memory>
+#include <string>
+
+#include "sensors/manager.hpp"
+#include "sensors/sensor.hpp"
+
+/**
+ * Build the sensors and associate them with a SensorManager.
+ */
+std::shared_ptr<SensorManager> BuildSensors(
+    const std::map<std::string, struct sensor>& config);
+
diff --git a/sensors/builderconfig.cpp b/sensors/builderconfig.cpp
new file mode 100644
index 0000000..b3507ae
--- /dev/null
+++ b/sensors/builderconfig.cpp
@@ -0,0 +1,114 @@
+/**
+ * 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 <iostream>
+#include <libconfig.h++>
+
+/* Configuration. */
+#include "conf.hpp"
+
+#include "sensors/builder.hpp"
+#include "sensors/manager.hpp"
+
+/*
+ * If there's a configuration file, we build from that, and it requires special
+ * parsing.  I should just ditch the compile-time version to reduce the
+ * probability of sync bugs.
+ */
+std::shared_ptr<SensorManager> BuildSensorsFromConfig(const std::string& path)
+{
+    using namespace libconfig;
+
+    std::map<std::string, struct sensor> config;
+    Config cfg;
+
+    std::cerr << "entered BuildSensorsFromConfig\n";
+
+    /* The load was modeled after the example source provided. */
+    try
+    {
+        cfg.readFile(path.c_str());
+    }
+    catch (const FileIOException& fioex)
+    {
+        std::cerr << "I/O error while reading file: " << fioex.what() << std::endl;
+        throw;
+    }
+    catch (const ParseException& pex)
+    {
+        std::cerr << "Parse error at " << pex.getFile() << ":" << pex.getLine()
+                  << " - " << pex.getError() << std::endl;
+        throw;
+    }
+
+    try
+    {
+        const Setting& root = cfg.getRoot();
+
+        /* Grab the list of sensors and create them all */
+        const Setting& sensors = root["sensors"];
+        int count = sensors.getLength();
+
+        for (int i = 0; i < count; ++i)
+        {
+            const Setting& sensor = sensors[i];
+
+            std::string name;
+            struct sensor thisOne;
+
+            /* Not a super fan of using this library for run-time configuration. */
+            name = sensor.lookup("name").c_str();
+            thisOne.type = sensor.lookup("type").c_str();
+            thisOne.readpath = sensor.lookup("readpath").c_str();
+            thisOne.writepath = sensor.lookup("writepath").c_str();
+
+            /* TODO: Document why this is wonky.  The library probably doesn't
+             * like int64_t
+             */
+            int min = sensor.lookup("min");
+            thisOne.min = static_cast<int64_t>(min);
+            int max = sensor.lookup("max");
+            thisOne.max = static_cast<int64_t>(max);
+            int timeout = sensor.lookup("timeout");
+            thisOne.timeout = static_cast<int64_t>(timeout);
+
+            // leaving for verification for now.  and yea the above is
+            // necessary.
+            std::cerr << "min: " << min
+                    << " max: " << max
+                    << " savedmin: " << thisOne.min
+                    << " savedmax: " << thisOne.max
+                    << " timeout: " << thisOne.timeout
+                    << std::endl;
+
+            config[name] = thisOne;
+        }
+    }
+    catch (const SettingTypeException &setex)
+    {
+        std::cerr << "Setting '" << setex.getPath()
+                  << "' type exception!" << std::endl;
+        throw;
+    }
+    catch (const SettingNotFoundException& snex)
+    {
+        std::cerr << "Setting not found!" << std::endl;
+        throw;
+    }
+
+    return BuildSensors(config);
+}
+
diff --git a/sensors/builderconfig.hpp b/sensors/builderconfig.hpp
new file mode 100644
index 0000000..078f484
--- /dev/null
+++ b/sensors/builderconfig.hpp
@@ -0,0 +1,12 @@
+#pragma once
+
+#include <memory>
+#include <string>
+
+#include "sensors/manager.hpp"
+
+/**
+ * Given a configuration file, parsable by libconfig++, parse it and then pass
+ * the information onto BuildSensors.
+ */
+std::shared_ptr<SensorManager> BuildSensorsFromConfig(const std::string& path);
diff --git a/sensors/manager.cpp b/sensors/manager.cpp
index 590ca80..fad2c33 100644
--- a/sensors/manager.cpp
+++ b/sensors/manager.cpp
@@ -14,235 +14,23 @@
  * limitations under the License.
  */
 
-#include <cstring>
-#include <iostream>
-#include <libconfig.h++>
-#include <map>
-#include <memory>
-
 /* Configuration. */
 #include "conf.hpp"
 
-#include "interfaces.hpp"
-#include "manager.hpp"
-#include "util.hpp"
-
-#include "dbus/dbuspassive.hpp"
-#include "notimpl/readonly.hpp"
-#include "notimpl/writeonly.hpp"
-#include "sysfs/sysfsread.hpp"
 #include "sensors/manager.hpp"
-#include "sensors/host.hpp"
-#include "sensors/pluggable.hpp"
-#include "sysfs/sysfswrite.hpp"
 
-
-static constexpr bool deferSignals = true;
-
-std::shared_ptr<SensorManager> BuildSensors(
-    std::map<std::string, struct sensor>& Config)
+void SensorManager::addSensor(
+        std::string type,
+        std::string name,
+        std::unique_ptr<Sensor> sensor)
 {
-    auto mgmr = std::make_shared<SensorManager>();
-    auto& HostSensorBus = mgmr->getHostBus();
-    auto& PassiveListeningBus = mgmr->getPassiveBus();
+    _sensorMap[name] = std::move(sensor);
 
-    for (auto& it : Config)
+    auto entry = _sensorTypeList.find(type);
+    if (entry == _sensorTypeList.end())
     {
-        std::unique_ptr<ReadInterface> ri;
-        std::unique_ptr<WriteInterface> wi;
-
-        std::string name = it.first;
-        struct sensor* info = &it.second;
-
-        std::cerr << "Sensor: " << name << " " << info->type << " ";
-        std::cerr << info->readpath << " " << info->writepath << "\n";
-
-        IOInterfaceType rtype = GetReadInterfaceType(info->readpath);
-        IOInterfaceType wtype = GetWriteInterfaceType(info->writepath);
-
-        // fan sensors can be ready any way and written others.
-        // fan sensors are the only sensors this is designed to write.
-        // Nothing here should be write-only, although, in theory a fan could be.
-        // I'm just not sure how that would fit together.
-        // TODO(venture): It should check with the ObjectMapper to check if
-        // that sensor exists on the Dbus.
-        switch (rtype)
-        {
-            case IOInterfaceType::DBUSPASSIVE:
-                ri = std::make_unique<DbusPassive>(
-                         PassiveListeningBus,
-                         info->type,
-                         name);
-                break;
-            case IOInterfaceType::EXTERNAL:
-                // These are a special case for read-only.
-                break;
-            case IOInterfaceType::SYSFS:
-                ri = std::make_unique<SysFsRead>(info->readpath);
-                break;
-            default:
-                ri = std::make_unique<WriteOnly>();
-                break;
-        }
-
-        if (info->type == "fan")
-        {
-            switch (wtype)
-            {
-                case IOInterfaceType::SYSFS:
-                    if (info->max > 0)
-                    {
-                        wi = std::make_unique<SysFsWritePercent>(
-                                 info->writepath,
-                                 info->min,
-                                 info->max);
-                    }
-                    else
-                    {
-                        wi = std::make_unique<SysFsWrite>(
-                                 info->writepath,
-                                 info->min,
-                                 info->max);
-                    }
-
-                    break;
-                default:
-                    wi = std::make_unique<ReadOnlyNoExcept>();
-                    break;
-            }
-
-            auto sensor = std::make_unique<PluggableSensor>(
-                              name,
-                              info->timeout,
-                              std::move(ri),
-                              std::move(wi));
-            mgmr->addSensor(info->type, name, std::move(sensor));
-        }
-        else if (info->type == "temp" || info->type == "margin")
-        {
-            // These sensors are read-only, but only for this application
-            // which only writes to fan sensors.
-            std::cerr << info->type << " readpath: " << info->readpath << "\n";
-
-            if (IOInterfaceType::EXTERNAL == rtype)
-            {
-                std::cerr << "Creating HostSensor: " << name
-                          << " path: " << info->readpath << "\n";
-
-                /*
-                 * The reason we handle this as a HostSensor is because it's
-                 * not quite pluggable; but maybe it could be.
-                 */
-                auto sensor = HostSensor::CreateTemp(
-                                  name,
-                                  info->timeout,
-                                  HostSensorBus,
-                                  info->readpath.c_str(),
-                                  deferSignals);
-                mgmr->addSensor(info->type, name, std::move(sensor));
-            }
-            else
-            {
-                wi = std::make_unique<ReadOnlyNoExcept>();
-                auto sensor = std::make_unique<PluggableSensor>(
-                                  name,
-                                  info->timeout,
-                                  std::move(ri),
-                                  std::move(wi));
-                mgmr->addSensor(info->type, name, std::move(sensor));
-            }
-        }
+        _sensorTypeList[type] = {};
     }
 
-    return mgmr;
+    _sensorTypeList[type].push_back(name);
 }
-
-/*
- * If there's a configuration file, we build from that, and it requires special
- * parsing.  I should just ditch the compile-time version to reduce the
- * probability of sync bugs.
- */
-std::shared_ptr<SensorManager> BuildSensorsFromConfig(std::string& path)
-{
-    using namespace libconfig;
-
-    std::map<std::string, struct sensor> config;
-    Config cfg;
-
-    std::cerr << "entered BuildSensorsFromConfig\n";
-
-    /* The load was modeled after the example source provided. */
-    try
-    {
-        cfg.readFile(path.c_str());
-    }
-    catch (const FileIOException& fioex)
-    {
-        std::cerr << "I/O error while reading file: " << fioex.what() << std::endl;
-        throw;
-    }
-    catch (const ParseException& pex)
-    {
-        std::cerr << "Parse error at " << pex.getFile() << ":" << pex.getLine()
-                  << " - " << pex.getError() << std::endl;
-        throw;
-    }
-
-    try
-    {
-        const Setting& root = cfg.getRoot();
-
-        /* Grab the list of sensors and create them all */
-        const Setting& sensors = root["sensors"];
-        int count = sensors.getLength();
-
-        for (int i = 0; i < count; ++i)
-        {
-            const Setting& sensor = sensors[i];
-
-            std::string name;
-            struct sensor thisOne;
-
-            /* Not a super fan of using this library for run-time configuration. */
-            name = sensor.lookup("name").c_str();
-            thisOne.type = sensor.lookup("type").c_str();
-            thisOne.readpath = sensor.lookup("readpath").c_str();
-            thisOne.writepath = sensor.lookup("writepath").c_str();
-
-            /* TODO: Document why this is wonky.  The library probably doesn't
-             * like int64_t
-             */
-            int min = sensor.lookup("min");
-            thisOne.min = static_cast<int64_t>(min);
-            int max = sensor.lookup("max");
-            thisOne.max = static_cast<int64_t>(max);
-            int timeout = sensor.lookup("timeout");
-            thisOne.timeout = static_cast<int64_t>(timeout);
-
-            // leaving for verification for now.  and yea the above is
-            // necessary.
-            std::cerr << "min: " << min
-                    << " max: " << max
-                    << " savedmin: " << thisOne.min
-                    << " savedmax: " << thisOne.max
-                    << " timeout: " << thisOne.timeout
-                    << std::endl;
-
-            config[name] = thisOne;
-        }
-    }
-    catch (const SettingTypeException &setex)
-    {
-        std::cerr << "Setting '" << setex.getPath()
-                  << "' type exception!" << std::endl;
-        throw;
-    }
-    catch (const SettingNotFoundException& snex)
-    {
-        std::cerr << "Setting not found!" << std::endl;
-        throw;
-    }
-
-    return BuildSensors(config);
-}
-
diff --git a/sensors/manager.hpp b/sensors/manager.hpp
index d466039..a3e7420 100644
--- a/sensors/manager.hpp
+++ b/sensors/manager.hpp
@@ -32,18 +32,7 @@
         void addSensor(
             std::string type,
             std::string name,
-            std::unique_ptr<Sensor> sensor)
-        {
-            _sensorMap[name] = std::move(sensor);
-
-            auto entry = _sensorTypeList.find(type);
-            if (entry == _sensorTypeList.end())
-            {
-                _sensorTypeList[type] = {};
-            }
-
-            _sensorTypeList[type].push_back(name);
-        }
+            std::unique_ptr<Sensor> sensor);
 
         // TODO(venture): Should implement read/write by name.
         std::unique_ptr<Sensor>& getSensor(std::string name)
@@ -69,7 +58,3 @@
         sdbusplus::bus::bus _hostSensorBus;
 };
 
-std::shared_ptr<SensorManager> BuildSensors(
-    std::map<std::string, struct sensor>& Config);
-
-std::shared_ptr<SensorManager> BuildSensorsFromConfig(std::string& path);
