diff --git a/config.go b/config.go
index 3d93bc85a06718b0ca9549b519049e432c8434ea..4e2e92bf49d548fdb8044c16176ba713ecdbbc09 100644
--- a/config.go
+++ b/config.go
@@ -20,6 +20,8 @@ var (
 		"bridge/state",
 		"bridge/logging",
 		"bridge/config",
+		"bridge/event",
+		"bridge/log",
 	}
 )
 
diff --git a/gateway.go b/gateway.go
index b64f45430a64a7e99a7cb91bc78c2522dafa7bae..198ada61822e494b2125c83fb1f96801ef0530c3 100644
--- a/gateway.go
+++ b/gateway.go
@@ -19,9 +19,8 @@ type Gateway struct {
 func NewGW(cfg *Config, eng *xaal.Engine) *Gateway {
 	gw := &Gateway{Devices: make(map[string]*Z2MDevice)}
 	gw.Config = cfg
-	gw.Client = mqttSetup(cfg, gw.mqttPublishHander)
-	// NOTE: Wondering if we can setup engine before
 	gw.Engine = eng
+	gw.Client = MQTTSetup(cfg, gw.MQTTHandler)
 	return gw
 }
 
@@ -31,7 +30,7 @@ func (gw *Gateway) GetZDevice(name string) *Z2MDevice {
 
 func (gw *Gateway) AddZDevice(zDev *Z2MDevice) {
 	for _, xDev := range zDev.XAALDevices {
-		dev := xDev.getXAALDevice()
+		dev := xDev.GetXAALDevice()
 		slog.Debug("Adding device", "dev", dev.String())
 		gw.Engine.AddDevice(dev)
 	}
@@ -41,7 +40,7 @@ func (gw *Gateway) AddZDevice(zDev *Z2MDevice) {
 
 func (gw *Gateway) RemoveZDevice(zDev *Z2MDevice) {
 	for _, xDev := range zDev.XAALDevices {
-		dev := xDev.getXAALDevice()
+		dev := xDev.GetXAALDevice()
 		slog.Debug("Removing device", "dev", dev.String())
 		gw.Engine.RemoveDevice(dev)
 	}
@@ -58,17 +57,21 @@ func (gw *Gateway) GetZDeviceByTopic(topic string) *Z2MDevice {
 	return gw.GetZDevice(name)
 }
 
-// mqttPublishHander handles all incoming MQTT messages
+// MQTTHandler handles all incoming MQTT messages
 // If the topic is /bridge/devices it will parse the json and create new devices
-// Else it will find the device with the topic and call the mqttDeviceHandler
-func (gw *Gateway) mqttPublishHander(client mqtt.Client, msg mqtt.Message) {
+// Else it will find the device with the topic and call the HandleMessage
+func (gw *Gateway) MQTTHandler(client mqtt.Client, msg mqtt.Message) {
 	// we ignore some topics
 	if slices.Contains(gw.Config.ignoredTopics, msg.Topic()) {
 		return
 	}
+	// some messages are empty
+	if len(msg.Payload()) == 0 {
+		return
+	}
 	// Is it devices definitions ?
 	if msg.Topic() == gw.Config.topic+"/bridge/devices" {
-		gw.jsonParseDevices(msg)
+		gw.Z2MParseDevices(msg)
 	} else {
 		zDev := gw.GetZDeviceByTopic(msg.Topic())
 		// mqttDumpMsg(msg)
@@ -78,14 +81,14 @@ func (gw *Gateway) mqttPublishHander(client mqtt.Client, msg mqtt.Message) {
 	}
 }
 
-// jsonParseDevices parses the bridge/devices json and creates new xAAL devices
-// if they don't exist
-func (gw *Gateway) jsonParseDevices(msg mqtt.Message) {
+// Z2MParseDevices parses the bridge/devices json and and sync xAAL with results
+func (gw *Gateway) Z2MParseDevices(msg mqtt.Message) {
 	var devices []Z2MDevice
 	slog.Debug("Parsing devices")
 	err := json.Unmarshal(msg.Payload(), &devices)
 	if err != nil {
 		slog.Error("Error decoding JSON", "err", err)
+		return
 	}
 
 	// search for new devices
@@ -96,7 +99,7 @@ func (gw *Gateway) jsonParseDevices(msg mqtt.Message) {
 		}
 		slog.Debug("Found new device", "name", zDev.FriendlyName)
 		zDev.Dump()
-		zDev.setupXAALDevices(gw)
+		zDev.FindXAALDevices(gw)
 		gw.AddZDevice(&zDev)
 		zDev.Sync()
 		// zDev.Available()
diff --git a/mqtt.go b/mqtt.go
index d568a2cd883fb1695b81154bac3fbcd209f15bb6..557869a4032e461eda6c5556672f8fa37057a2b0 100644
--- a/mqtt.go
+++ b/mqtt.go
@@ -10,8 +10,8 @@ import (
 	"github.com/jedib0t/go-pretty/v6/table"
 )
 
-// mqttSetup creates a new MQTT client
-func mqttSetup(cfg *Config, publishHandler mqtt.MessageHandler) mqtt.Client {
+// MQTTSetup creates a new MQTT client
+func MQTTSetup(cfg *Config, publishHandler mqtt.MessageHandler) mqtt.Client {
 	// This JS style of creating a client is awfully verbose
 	opts := mqtt.NewClientOptions().
 		AddBroker(fmt.Sprintf("tcp://%s:%d", cfg.brokerHost, cfg.brokerPort)).
@@ -29,8 +29,8 @@ func mqttSetup(cfg *Config, publishHandler mqtt.MessageHandler) mqtt.Client {
 	return client
 }
 
-// mqttDumpMsg displays the MQTT message
-func mqttDumpMsg(msg mqtt.Message) {
+// MQTTDumpMsg displays the MQTT message
+func MQTTDumpMsg(msg mqtt.Message) {
 	var data map[string]interface{}
 	err := json.Unmarshal(msg.Payload(), &data)
 	if err != nil {
diff --git a/xaal.go b/xaal.go
index 6088e193ea2f368cd9a7f1dadbe6601a832405df..17f68a286ffc84e33c4e49516ef6a68711fe9f7f 100644
--- a/xaal.go
+++ b/xaal.go
@@ -55,7 +55,7 @@ type ButtonRemote struct {
 
 type XAALDeviceInterface interface {
 	update(map[string]interface{})
-	getXAALDevice() *xaal.Device
+	GetXAALDevice() *xaal.Device
 }
 
 func (dev *XAALDevice) setup() {
@@ -67,7 +67,7 @@ func (dev *XAALDevice) setup() {
 	dev.Info = "z2m:" + zDev.Type + ":" + zDev.FriendlyName
 }
 
-func (dev *XAALDevice) getXAALDevice() *xaal.Device {
+func (dev *XAALDevice) GetXAALDevice() *xaal.Device {
 	return dev.Device
 }
 
diff --git a/z2m.go b/z2m.go
index ce60d87084e66afd5d1d9b91ff3dac3090ec0a60..c8fab244c4e259af03c54e6378c8f81757bb437b 100644
--- a/z2m.go
+++ b/z2m.go
@@ -79,7 +79,7 @@ func (zDev *Z2MDevice) HandleMessage(msg mqtt.Message) {
 	var data map[string]interface{}
 	err := json.Unmarshal(msg.Payload(), &data)
 	if err != nil {
-		slog.Error("Error decoding JSON", "err", err)
+		slog.Error("Error decoding JSON", "err", err, "topic", msg.Topic(), "data", msg.Payload())
 	} else {
 		slog.Debug("Updating device:", "name", zDev.FriendlyName)
 		for _, dev := range zDev.XAALDevices {
@@ -89,8 +89,7 @@ func (zDev *Z2MDevice) HandleMessage(msg mqtt.Message) {
 }
 
 // creates new xAAL devices from a bridge device
-func (zDev *Z2MDevice) setupXAALDevices(gw *Gateway) {
-	// TODO: Handle errors
+func (zDev *Z2MDevice) FindXAALDevices(gw *Gateway) {
 	baseAddr := gw.Config.baseAddr
 	ieeeAddr, _ := hexStringToInteger(zDev.IeeeAddress)
 	baseAddr, _ = baseAddr.Add(int64(ieeeAddr))
@@ -123,7 +122,7 @@ func (zDev *Z2MDevice) setupXAALDevices(gw *Gateway) {
 
 		if dev != nil {
 			zDev.XAALDevices = append(zDev.XAALDevices, dev)
-			xaalDev := dev.getXAALDevice()
+			xaalDev := dev.GetXAALDevice()
 			xaalDev.GroupID = grpAdd
 		}
 	}