diff --git a/CLC-qthing/SiliconTorch/CyanBus.cpp b/CLC-qthing/SiliconTorch/CyanBus.cpp
index c6eeb1b468e8106f5f11116520fa0e3f4681b548..dd8162ac978d4dd209b0d05203d465d06b9afcad 100644
--- a/CLC-qthing/SiliconTorch/CyanBus.cpp
+++ b/CLC-qthing/SiliconTorch/CyanBus.cpp
@@ -137,7 +137,7 @@ namespace SiliconTorch {
           size_t available;
           uart_get_buffered_data_len(_ch, &available);
 
-          ESP_LOGI(TAG, "Got a new UART event! 🤩   QByte[ %d ]  QMsg#[ %d ]  event.size[ %d ]  uart.available[ %d ]", space, msgs, event.size, available);
+          ESP_LOGI(TAG, "Got a new UART event! 🤩   QByte[ %d ]  |QMsg|[ %d ]  event.size[ %d ]  uart.available[ %d ]", space, msgs, event.size, available);
 
           switch (event.type) {
 
@@ -145,7 +145,7 @@ namespace SiliconTorch {
             case UART_DATA: {
 
               if ((bufPTR - buffer) + event.size > bufLEN) {
-                ESP_LOGE(TAG, "Buffer#[ %d ] Overflow!", bufLEN);
+                ESP_LOGE(TAG, "|buffer|[ %d ] Overflow!", bufLEN);
 
                 bufPTR = buffer;
                 std::memset(buffer, 0x00, bufLEN);  // TODO: needed…?
@@ -162,7 +162,7 @@ namespace SiliconTorch {
 
                 if (strncmp(reinterpret_cast<const char*>(buffer), HEADER, headerLEN) == 0) {
                   payloadLEN = getLength(buffer + headerLEN);
-                  ESP_LOGW(TAG, "Found header: payload#[ %d ]", payloadLEN);
+                  ESP_LOGW(TAG, "Found header: |payload|[ %d ]", payloadLEN);
 
                   if (payloadLEN > MTU) {
                     ESP_LOGE(TAG, "payload#[ %d ] exceeds MTU[ %d ]", payloadLEN, MTU);
@@ -191,7 +191,9 @@ namespace SiliconTorch {
                 else ESP_LOGE(TAG, "Packet CRC check failed!");
 
                 bufPTR = buffer;
-                std::memset(buffer, 0x00, bufLEN);  // TODO: needed…?
+                std::memset(buffer, 0x00, bufLEN);  // TODO: needed…?    (if not: move to --> if not crcOK………)
+
+                if (!crcOK) xQueueSendToBack(Q2, (void*)buffer, portMAX_DELAY);
 
                 // TODO: do we really need this after successful packet reception? I think not!
                 // uart_flush_input(_ch);
@@ -267,16 +269,37 @@ namespace SiliconTorch {
         if (xQueueReceive(Q, (void*)buffer, (TickType_t)portMAX_DELAY)) {
 
           payloadLEN = getLength(buffer);
+          bool crcOK = payloadLEN > 0;
+
+          if (crcOK) ESP_LOGE("PacketTask", "PACKET DEBUG: |payload|[ %d ] starts with data[ %s ]", payloadLEN, buffer+2);
+          else ESP_LOGE("PacketTask", "PACKET DEBUG: |payload|[ %d ] has incorrect CRC", payloadLEN);
+
+          const PacketData packet = {
+            .buffer = buffer+2,
+            .length = payloadLEN
+          };
 
-          ESP_LOGE("PacketTask", "PACKET DEBUG: payload#[ %d ] starts with data[ %s ]", payloadLEN, buffer+2);
+          const PacketMetrics metrics = {
+            .crcOK = crcOK,
+            .payloadLEN = payloadLEN
+          };
 
-          // TODO: really handle packet!
+          if (crcOK) packetCallback(packet);
+          metricsCallback(metrics);
         }
       }
 
       delete buffer;
     }
 
+
+    // void CyanBus::registerPacketCallback(std::string& magicString, PacketCallback callback) {
+    // }
+
+    // void CyanBus::registerMetricsCallback(MetricsCallback callback) {
+    // }
+
+
     void CyanBus::setBaudRate(uint32_t baudRate) {
       uart_set_baudrate((uart_port_t)uartChannel, baudRate);
     }
diff --git a/CLC-qthing/SiliconTorch/CyanBus.hpp b/CLC-qthing/SiliconTorch/CyanBus.hpp
index 47f267bb69f0525e706ee82e9b9dd3b68815c9f8..ad1e9f8018c4270751af0fabf55f85cbf59e5004 100644
--- a/CLC-qthing/SiliconTorch/CyanBus.hpp
+++ b/CLC-qthing/SiliconTorch/CyanBus.hpp
@@ -10,6 +10,7 @@
 #include "freertos/queue.h"
 
 // project specific
+#include "SpiderLib/Callback.hpp"
 #include "LambdaTask.hpp"
 
 
@@ -25,6 +26,17 @@ namespace SiliconTorch {
     extern const char* const HEADER;
 
 
+    typedef struct {
+      const uint8_t* buffer;
+      const uint16_t length;
+    } PacketData;
+
+    typedef struct {
+      const bool crcOK;
+      const uint16_t payloadLEN;
+    } PacketMetrics;
+
+
     class CyanBus {
       public:
         CyanBus(uint8_t tx, uint8_t rx, uint8_t de, uint8_t re, uint32_t baudRate = 115200, uint8_t uartChannel = 1);
@@ -32,6 +44,12 @@ namespace SiliconTorch {
         uint32_t getBaudRate();
         void setBaudRate(uint32_t baudRate);
 
+        const SpiderLib::Callback<void(const PacketData&)>    packetCallback;
+        const SpiderLib::Callback<void(const PacketMetrics&)> metricsCallback;
+
+        // void registerMetricsCallback(MetricsCallback callback);
+        // void registerPacketCallback(std::string& magicString, PacketCallback callback);
+
       private:
 
         QueueHandle_t uartEvQ;
diff --git a/CLC-qthing/SiliconTorch/VSyncManager.cpp b/CLC-qthing/SiliconTorch/VSyncManager.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9bc9fc923eb9d7ba9e0f6a9e258c0e16ccccdb2d
--- /dev/null
+++ b/CLC-qthing/SiliconTorch/VSyncManager.cpp
@@ -0,0 +1,22 @@
+#include "VSyncManager.hpp"
+
+// C++ system level
+// #include <cstring>  // memset, strncmp
+// #include <cstdlib>  // TODO: is this for memcpy?
+// #include <cinttypes>
+// #include <functional>
+
+// ESP32 specific
+#include "esp_log.h"
+// #include "driver/gpio.h"
+// #include "driver/uart.h"
+// #include "freertos/FreeRTOS.h"
+// #include "freertos/queue.h"
+
+// project specific
+// #include "CyanBusCRC.hpp"
+
+// qthing stuff
+// #include ""
+
+
diff --git a/CLC-qthing/SiliconTorch/VSyncManager.hpp b/CLC-qthing/SiliconTorch/VSyncManager.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..69ca8c75867c65da9f586309f6bb6f7ba7a473e2
--- /dev/null
+++ b/CLC-qthing/SiliconTorch/VSyncManager.hpp
@@ -0,0 +1,22 @@
+#pragma once
+
+// C++ system level
+// #include <cstring>  // memset, strncmp
+// #include <cstdlib>  // TODO: is this for memcpy?
+// #include <cinttypes>
+// #include <functional>
+
+// ESP32 specific
+#include "esp_log.h"
+// #include "driver/gpio.h"
+// #include "driver/uart.h"
+// #include "freertos/FreeRTOS.h"
+// #include "freertos/queue.h"
+
+// project specific
+// #include "CyanBusCRC.hpp"
+
+// qthing stuff
+// #include ""
+
+
diff --git a/CLC-qthing/SpiderLib/Callback.hpp b/CLC-qthing/SpiderLib/Callback.hpp
index 658b183507e792fed47c6c03b03d9e33e5d4696a..d637e17ebdbddbd71eebc99e4386a90cfddee855 100644
--- a/CLC-qthing/SpiderLib/Callback.hpp
+++ b/CLC-qthing/SpiderLib/Callback.hpp
@@ -31,16 +31,16 @@ namespace SpiderLib {
 
       Callback() : callback(NULL) {};
 
-      void operator()(Args&&... args) {
+      void operator()(Args&&... args) const {
         if (callback != NULL) callback(std::forward<Args>(args)...);
       }
 
-      auto& operator+=(const CallbackF& newCB) {
+      auto& operator+=(const CallbackF& newCB) const {
         add(newCB);
         return *this;
       }
 
-      void add(CallbackF newCB) {
+      void add(CallbackF newCB) const {
         if (callback == NULL) {
           callback = newCB;
         } else {
@@ -53,7 +53,7 @@ namespace SpiderLib {
       }
 
     private:
-      CallbackF callback = NULL;
+      mutable CallbackF callback = NULL;
   };
 
 }
diff --git a/CLC-qthing/device_main.cpp b/CLC-qthing/device_main.cpp
index 8016e81dc4453f58c10f9b5e9535c608f5f46f7c..3ca3499c8b02ac2e71045a99c3f87031c5d2ee7b 100644
--- a/CLC-qthing/device_main.cpp
+++ b/CLC-qthing/device_main.cpp
@@ -27,18 +27,27 @@ qthing::Config cfg;
 
 CyanLight::CyanLightControl* ctrl;
 
+
 void device_main() {
 
   // Needed for packet parsing, animation rendering and stuff
   qthing::power_managment_max_power();
 
 
+  cyanBus = new SiliconTorch::CyanBus::CyanBus(13, 14, 12, 15, 2000000);  // Pinout of CyanStripe
 
-  cyanBus = new SiliconTorch::CyanBus::CyanBus(13, 14, 12, 15);  // Pinout of CyanStripe
 
-  // TODO: ???
+  cyanBus->packetCallback += [](SiliconTorch::CyanBus::PacketData& data) {
+    ESP_LOGW("PacketDataTestCallback", "|buffer|[ %d ]   buffer[ %s ]", data.length, data.buffer);
+  };
+
+  cyanBus->metricsCallback += [](SiliconTorch::CyanBus::PacketMetrics& metrics) {
+    ESP_LOGW("PacketMetricsTestCallback", "|buffer|[ %d ]   crc⏻[ %s ]", metrics.payloadLEN, metrics.crcOK ? "✔" : "✘");  // TODO: better use ✅ / ❌  ??
+  };
 
 
+  // TODO: ???
+
 
   qthing::enable_wifi();
   cfg.apply();