diff --git a/CLC-qthing/Controller.cpp b/CLC-qthing/Controller.cpp
index bbcbb4a3fcfb9a4c895f47b73ac6ca19f0d2ee7f..30495beab4bca082dc437d435cfd59e34b0b0dbd 100644
--- a/CLC-qthing/Controller.cpp
+++ b/CLC-qthing/Controller.cpp
@@ -6,6 +6,7 @@
 #include <string>
 #include <cstdio>
 #include <cstdlib>
+#include <function>
 #include <algorithm>
 
 #include "esp_err.h"
@@ -61,18 +62,17 @@ CyanLight::Controller::Controller(uint8_t networkChannel, uint8_t channelsConfig
   }
 
 
-  add_message_callback(DEVICE_NAMESPACE "CyanLight/frequency/set", [&](std::string message) {
+  std::function<void(std::string)> setFrq = [&](std::string message) {
     long int frq = strtol(message.c_str(), NULL, 0);
     this->setFrequency(frq);
-  });
+  };
 
-  add_message_callback(DEVICE_NAMESPACE "CyanLight/resolution/set", [&](std::string message) {
+  std::function<void(std::string)> setRes = [&](std::string message) {
     long int res = strtol(message.c_str(), NULL, 0);
     this->setResolution(res);
-  });
+  };
 
-  // atomic setter for both values
-  add_message_callback(DEVICE_NAMESPACE "CyanLight/frqres/set", [&](std::string message) {
+  std::function<void(std::string)> setFrqRes = [&](std::string message) {
     std::string::size_type found = message.find(delimiter);
 
     if (found == std::string::npos) {
@@ -92,27 +92,41 @@ CyanLight::Controller::Controller(uint8_t networkChannel, uint8_t channelsConfig
     }
 
     this->setFrqRes(frq, res);
-  });
-
-
-  add_message_callback(DEVICE_NAMESPACE "CyanLight/frequency/get", [&](std::string ignored) {
-    char tmp[16];
-    snprintf(tmp, sizeof(tmp), "%i", this->getFrequency());
-    publish_message(DEVICE_NAMESPACE "CyanLight/frequency", tmp);
-  });
-
-  add_message_callback(DEVICE_NAMESPACE "CyanLight/resolution/get", [&](std::string ignored) {
-    char tmp[16];
-    snprintf(tmp, sizeof(tmp), "%i", this->getResolution());
-    publish_message(DEVICE_NAMESPACE "CyanLight/resolution", tmp);
-  });
-
-  // and for symmetric reasons: here comes the counterpart to the atomic frq-res-setter
-  add_message_callback(DEVICE_NAMESPACE "CyanLight/frqres/get", [&](std::string ignored) {
-    char tmp[32];
-    snprintf(tmp, sizeof(tmp), "%i%s%i", this->getFrequency(), delimiter.c_str(), this->getResolution());
-    publish_message(DEVICE_NAMESPACE "CyanLight/frqres", tmp);
-  });
+  };
+
+
+  std::function<void(std::string)> getFrq = [&](std::string ignored) {
+    this->publishFrequency();
+  };
+
+  std::function<void(std::string)> getRes = [&](std::string ignored) {
+    this->publishResolution();
+  };
+
+  std::function<void(std::string)> getFrqRes = [&](std::string ignored) {
+    this->publishFrqRes();
+  };
+
+
+  // device-local setters
+  add_message_callback(DEVICE_NAMESPACE "CyanLight/frqres/set", setFrqRes);
+  add_message_callback(DEVICE_NAMESPACE "CyanLight/frequency/set", setFrq);
+  add_message_callback(DEVICE_NAMESPACE "CyanLight/resolution/set", setRes);
+
+  // device-lokal getters
+  add_message_callback(DEVICE_NAMESPACE "CyanLight/frequency/get", getFrq);
+  add_message_callback(DEVICE_NAMESPACE "CyanLight/resolution/get", getRes);
+  add_message_callback(DEVICE_NAMESPACE "CyanLight/frqres/get", getFrqRes);
+
+  // global setters
+  add_message_callback("service/CyanLight/frqres/set", setFrqRes);
+  add_message_callback("service/CyanLight/frequency/set", setFrq);
+  add_message_callback("service/CyanLight/resolution/set", setRes);
+
+  // global getters
+  add_message_callback("service/CyanLight/frequency/get", getFrq);
+  add_message_callback("service/CyanLight/resolution/get", getRes);
+  add_message_callback("service/CyanLight/frqres/get", getFrqRes);
 }
 
 
@@ -168,3 +182,22 @@ bool CyanLight::Controller::setResolution(uint8_t res_bits) {
 uint8_t CyanLight::Controller::getResolution() {
   return this->resolution;
 }
+
+void CyanLight::Controller::publishFrequency() {
+  char tmp[16];
+  snprintf(tmp, sizeof(tmp), "%i", this->getFrequency());
+  publish_message(DEVICE_NAMESPACE "CyanLight/frequency", tmp);
+}
+
+void CyanLight::Controller::publishResolution() {
+  char tmp[16];
+  snprintf(tmp, sizeof(tmp), "%i", this->getResolution());
+  publish_message(DEVICE_NAMESPACE "CyanLight/resolution", tmp);
+}
+
+void CyanLight::Controller::publishFrqRes() {
+  char tmp[32];
+  snprintf(tmp, sizeof(tmp), "%i%s%i", this->getFrequency(), delimiter.c_str(), this->getResolution());
+  publish_message(DEVICE_NAMESPACE "CyanLight/frqres", tmp);
+}
+
diff --git a/CLC-qthing/CyanLightControl.hpp b/CLC-qthing/CyanLightControl.hpp
index 2a45baa63e6f56d0d0932bc60fb01ca1425f92f5..1afdd3e46a5071892355c90f08c725f02a5cbc8a 100644
--- a/CLC-qthing/CyanLightControl.hpp
+++ b/CLC-qthing/CyanLightControl.hpp
@@ -28,6 +28,10 @@ namespace CyanLight {
       uint8_t getResolution();
 
       bool setFrqRes(uint32_t frq_hz, uint8_t res_bits);
+
+      void publishFrqRes();
+      void publishFrequency();
+      void publishResolution();
     private:
       uint32_t frequency = 1000;  // Hz
       uint8_t resolution =  10;  // bits