diff --git a/src/ExternalSensor.cpp b/src/ExternalSensor.cpp
index 13082e3..3aba626 100644
--- a/src/ExternalSensor.cpp
+++ b/src/ExternalSensor.cpp
@@ -26,9 +26,7 @@
     const std::string& sensorName, const std::string& sensorUnits,
     std::vector<thresholds::Threshold>&& thresholdsIn,
     const std::string& sensorConfiguration, double maxReading,
-    double minReading, double timeoutSecs, const PowerState& powerState,
-    std::function<void(std::chrono::steady_clock::time_point now)>&&
-        writeHookIn) :
+    double minReading, double timeoutSecs, const PowerState& powerState) :
     // TODO(): When the Mutable feature is integrated,
     // make sure all ExternalSensor instances are mutable,
     // because that is the entire point of ExternalSensor,
@@ -41,8 +39,7 @@
     writeTimeout(
         std::chrono::duration_cast<std::chrono::steady_clock::duration>(
             std::chrono::duration<double>(timeoutSecs))),
-    writeAlive(false), writePerishable(timeoutSecs > 0.0),
-    writeHook(std::move(writeHookIn))
+    writeAlive(false), writePerishable(timeoutSecs > 0.0)
 {
     // The caller must specify what physical characteristic
     // an external sensor is expected to be measuring, such as temperature,
@@ -75,14 +72,6 @@
         objectServer.add_interface(objectPath, association::interface);
     setInitialProperties(conn);
 
-    externalSetHook = [weakThis = weak_from_this()]() {
-        auto lockThis = weakThis.lock();
-        if (lockThis)
-        {
-            lockThis->externalSetTrigger();
-        }
-    };
-
     if constexpr (debug)
     {
         std::cerr << "ExternalSensor " << name << " constructed: path "
@@ -95,6 +84,31 @@
     }
 }
 
+// Separate function from constructor, because of a gotcha: can't use the
+// enable_shared_from_this() API until after the constructor has completed.
+void ExternalSensor::initWriteHook(
+    std::function<void(std::chrono::steady_clock::time_point now)>&&
+        writeHookIn)
+{
+    // Connect ExternalSensorMain with ExternalSensor
+    writeHook = std::move(writeHookIn);
+
+    // Connect ExternalSensor with Sensor
+    auto weakThis = weak_from_this();
+    externalSetHook = std::move([weakThis]() {
+        auto lockThis = weakThis.lock();
+        if (lockThis)
+        {
+            lockThis->externalSetTrigger();
+            return;
+        }
+        if constexpr (debug)
+        {
+            std::cerr << "ExternalSensor receive ignored, sensor gone\n";
+        }
+    });
+}
+
 ExternalSensor::~ExternalSensor()
 {
     // Make sure the write hook does not reference this object anymore
diff --git a/src/ExternalSensorMain.cpp b/src/ExternalSensorMain.cpp
index 0712b00..647eb5a 100644
--- a/src/ExternalSensorMain.cpp
+++ b/src/ExternalSensorMain.cpp
@@ -126,13 +126,14 @@
         if (err != boost::system::errc::success)
         {
             // Cancellation is normal, as timer is dynamically rescheduled
-            if (err != boost::system::errc::operation_canceled)
+            if (err != boost::asio::error::operation_aborted)
             {
                 std::cerr << "ExternalSensor timer scheduling problem: "
                           << err.message() << "\n";
             }
             return;
         }
+
         updateReaper(sensors, timer, std::chrono::steady_clock::now());
     });
 
@@ -155,6 +156,11 @@
         sensorsChanged,
     boost::asio::steady_timer& reaperTimer)
 {
+    if constexpr (debug)
+    {
+        std::cerr << "ExternalSensor considering creating sensors\n";
+    }
+
     auto getter = std::make_shared<GetSensorConfiguration>(
         dbusConnection,
         [&io, &objectServer, &sensors, &dbusConnection, sensorsChanged,
@@ -284,6 +290,11 @@
                             sensorsChanged->erase(it);
                             findSensor->second = nullptr;
                             found = true;
+                            if constexpr (debug)
+                            {
+                                std::cerr << "ExternalSensor " << sensorName
+                                          << " change found\n";
+                            }
                             break;
                         }
                     }
@@ -315,7 +326,8 @@
                 sensorEntry = std::make_shared<ExternalSensor>(
                     sensorType, objectServer, dbusConnection, sensorName,
                     sensorUnits, std::move(sensorThresholds), interfacePath,
-                    maxValue, minValue, timeoutSecs, readState,
+                    maxValue, minValue, timeoutSecs, readState);
+                sensorEntry->initWriteHook(
                     [&sensors, &reaperTimer](
                         const std::chrono::steady_clock::time_point& now) {
                         updateReaper(sensors, reaperTimer, now);
@@ -364,14 +376,22 @@
                 std::cerr << "callback method error\n";
                 return;
             }
-            sensorsChanged->insert(message.get_path());
+
+            auto messagePath = message.get_path();
+            sensorsChanged->insert(messagePath);
+            if constexpr (debug)
+            {
+                std::cerr << "ExternalSensor change event received: "
+                          << messagePath << "\n";
+            }
+
             // this implicitly cancels the timer
             filterTimer.expires_from_now(boost::posix_time::seconds(1));
 
             filterTimer.async_wait([&io, &objectServer, &sensors, &systemBus,
                                     &sensorsChanged, &reaperTimer](
                                        const boost::system::error_code& ec) {
-                if (ec)
+                if (ec != boost::system::errc::success)
                 {
                     if (ec != boost::asio::error::operation_aborted)
                     {
@@ -379,6 +399,7 @@
                     }
                     return;
                 }
+
                 createSensors(io, objectServer, sensors, systemBus,
                               sensorsChanged, reaperTimer);
             });
