diff --git a/CLC-qthing/SiliconTorch/Service/SpiderFurnace.cpp b/CLC-qthing/SiliconTorch/Service/SpiderFurnace.cpp
index 7c450d6bef7b0072ab4e5de1593337f16bd86a4a..6a385fdd9c50d9c834544f4224f99fc3a16340b2 100644
--- a/CLC-qthing/SiliconTorch/Service/SpiderFurnace.cpp
+++ b/CLC-qthing/SiliconTorch/Service/SpiderFurnace.cpp
@@ -16,6 +16,7 @@
 
 // qthing stuff
 #include <qthing>
+//#include <qthing/mqtt_common.hpp>
 #include "SiliconTorch/CyanBus.hpp"
 
 // misc
@@ -25,6 +26,7 @@
 using nlohmann::json;
 using SpiderLib::Time;
 
+
 static const char* TAG = "SpiderFurnace";
 
 
@@ -97,61 +99,89 @@ namespace SiliconTorch {
 
 
         // Set-up PID controller
-        pidTask = new SpiderLib::Util::LambdaTask([&](){
+        if (CFG_EN_PIDTask) {
+
+          pidTask = new SpiderLib::Util::LambdaTask([&](){
+
+            TickType_t lastWakeTime = xTaskGetTickCount();
+            tc0age = Time::ms();
+
+            f32 error      = 0.0f;
+            f32 sum_error  = 0.0f;
+            f32 diff_error = 0.0f;
+            f32 last_error = 0.0f;
+
+            while (true) {
+
+              faultReg.value = tc0->readU8(MAX31856::SR::addr);
+
+              if (!hasFault()) {
+                f32 t = tc0->getTemperature();
 
-          TickType_t lastWakeTime = xTaskGetTickCount();
-          tc0age = Time::ms();
+                f32 deltaT = abs(t - temperature());
+                //if (deltaT < 0) deltaT *= -1.0f;
 
-          f32 error      = 0.0f;
-          f32 sum_error  = 0.0f;
-          f32 diff_error = 0.0f;
-          f32 last_error = 0.0f;
+                f32 tc0age_ = (Time::ms() - tc0age) / 1000.0f;  // change to seconds
+                if (deltaT > tc0age_ * MaxTempChangePerSecond) {  // temp changed too fast!
+                  faultReg.OPEN = true;  // mimic fault!
+                } else {
+                  tc0dat->insert(t);
+                  tc0age = Time::ms();
+                }
+              }
+
+              f32 t = temperature();
 
-          while (true) {
+              if (!hasFault() && t <= MAX_TEMP) {
 
-            faultReg.value = tc0->readU8(MAX31856::SR::addr);
+                error      = targetTemperature - t;
+                sum_error += error;                  // TODO: "I festhalten"
+                diff_error = last_error - error;
+                last_error = error;
 
-            if (!hasFault()) {
-              f32 t = tc0->getTemperature();
+                f32 out    = kP * error;
+                out       += kI * sum_error;
+                out       += kD * diff_error;
 
-              f32 deltaT = abs(t - temperature());
-              //if (deltaT < 0) deltaT *= -1.0f;
+                // if (out > MAX_PWM)
+                // TODO: "I festhalten" ??
 
-              f32 tc0age_ = (Time::ms() - tc0age) / 1000.0f;  // change to seconds
-              if (deltaT > tc0age_ * MaxTempChangePerSecond) {  // temp changed too fast!
-                faultReg.OPEN = true;  // mimic fault!
+                setPWM(out);
               } else {
-                tc0dat->insert(t);
-                tc0age = Time::ms();
+                setPWM(0.0f);
               }
+
+              ESP_LOGI(TAG, "T: %.2f °C    Fault: %s    _i: %.2f   PWM: %.2f", t, hasFault() ? "true" : "false", sum_error, pwmVal);
+
+              vTaskDelayUntil(&lastWakeTime, 1000 / TICK_FREQ / portTICK_PERIOD_MS);
             }
+          });
 
-            f32 t = temperature();
+        } else {
 
-            if (!hasFault() && t <= MAX_TEMP) {
+          qthing::add_message_callback(deviceTopic(TAG, "setPWM"), [&](const str& message) {
+            setPWM(std::strtof(message.c_str(), NULL));
+          });
 
-              error      = targetTemperature - t;
-              sum_error += error;                  // TODO: "I festhalten"
-              diff_error = last_error - error;
-              last_error = error;
+        }
 
-              f32 out    = kP * error;
-              out       += kI * sum_error;
-              out       += kD * diff_error;
 
-              // if (out > MAX_PWM)
-              // TODO: "I festhalten" ??
+        if (CFG_EN_MQTT_PIDvals) {
 
-              setPWM(out);
-            } else {
-              setPWM(0.0f);
-            }
+          qthing::add_message_callback(deviceTopic(TAG, "kP"), [&](const str& message) {
+            kP = std::strtof(message.c_str(), NULL);
+          });
+
+          qthing::add_message_callback(deviceTopic(TAG, "kI"), [&](const str& message) {
+            kI = std::strtof(message.c_str(), NULL);
+          });
+
+          qthing::add_message_callback(deviceTopic(TAG, "kD"), [&](const str& message) {
+            kD = std::strtof(message.c_str(), NULL);
+          });
 
-            ESP_LOGI(TAG, "T: %.2f °C    Fault: %s    _i: %.2f   PWM: %.2f", t, hasFault() ? "true" : "false", sum_error, pwmVal);
+        }
 
-            vTaskDelayUntil(&lastWakeTime, 1000 / TICK_FREQ / portTICK_PERIOD_MS);
-          }
-        });
       }
 
       void SpiderFurnace::setTargetTemperature(f32 t) {
diff --git a/CLC-qthing/SiliconTorch/Service/SpiderFurnace.hpp b/CLC-qthing/SiliconTorch/Service/SpiderFurnace.hpp
index 9a56695f13baf216f3b7f288a94790f246fa0bc5..13dd81a0b588e57ce20d1ef5a232bb08db114b65 100644
--- a/CLC-qthing/SiliconTorch/Service/SpiderFurnace.hpp
+++ b/CLC-qthing/SiliconTorch/Service/SpiderFurnace.hpp
@@ -45,15 +45,23 @@ namespace SiliconTorch {
       constexpr u8 IO_HEATER               =    25;
 
 
-      enum FurnaceState {
-        RUNNING,
-        PAUSED,
-        STOPPED
-      };
+      // enum FurnaceState {
+      //   RUNNING,
+      //   PAUSED,
+      //   STOPPED
+      // };
+
+
+
+
+      // TODO: ???
+      // Compile-time config
+      constexpr bool CFG_EN_PIDTask      = false;  // !!
+      constexpr bool CFG_EN_MQTT_PIDvals = true;
 
 
 
-      class SpiderFurnace : public ServiceManager::Service {
+      class SpiderFurnace : public ServiceManager::Service, public SpiderLib::HasMQTT {
 
         public: