diff --git a/gateway.go b/gateway.go
index 4b5de729cc7aef27c437d679b6484d12a3b7db2d..b64f45430a64a7e99a7cb91bc78c2522dafa7bae 100644
--- a/gateway.go
+++ b/gateway.go
@@ -30,11 +30,21 @@ func (gw *Gateway) GetZDevice(name string) *Z2MDevice {
 }
 
 func (gw *Gateway) AddZDevice(zDev *Z2MDevice) {
+	for _, xDev := range zDev.XAALDevices {
+		dev := xDev.getXAALDevice()
+		slog.Debug("Adding device", "dev", dev.String())
+		gw.Engine.AddDevice(dev)
+	}
 	gw.Devices[zDev.FriendlyName] = zDev
 	zDev.Gateway = gw
 }
 
 func (gw *Gateway) RemoveZDevice(zDev *Z2MDevice) {
+	for _, xDev := range zDev.XAALDevices {
+		dev := xDev.getXAALDevice()
+		slog.Debug("Removing device", "dev", dev.String())
+		gw.Engine.RemoveDevice(dev)
+	}
 	zDev.Gateway = nil
 	delete(gw.Devices, zDev.FriendlyName)
 }
@@ -72,20 +82,37 @@ func (gw *Gateway) mqttPublishHander(client mqtt.Client, msg mqtt.Message) {
 // if they don't exist
 func (gw *Gateway) jsonParseDevices(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)
 	}
 
+	// search for new devices
 	for _, zDev := range devices {
 		known := gw.GetZDevice(zDev.FriendlyName)
 		if known != nil {
 			continue
 		}
+		slog.Debug("Found new device", "name", zDev.FriendlyName)
 		zDev.Dump()
 		zDev.setupXAALDevices(gw)
 		gw.AddZDevice(&zDev)
 		zDev.Sync()
 		// zDev.Available()
 	}
+	// search for deleted devices
+	for _, zDev := range gw.GetZDevices() {
+		found := false
+		for _, dev := range devices {
+			if dev.FriendlyName == zDev.FriendlyName {
+				found = true
+				break
+			}
+		}
+		if !found {
+			slog.Debug("Device removed", "name", zDev.FriendlyName)
+			gw.RemoveZDevice(zDev)
+		}
+	}
 }
diff --git a/z2m.go b/z2m.go
index a9667f0a635a7e969baee0ea160b97b2cd5c3727..ce60d87084e66afd5d1d9b91ff3dac3090ec0a60 100644
--- a/z2m.go
+++ b/z2m.go
@@ -125,7 +125,6 @@ func (zDev *Z2MDevice) setupXAALDevices(gw *Gateway) {
 			zDev.XAALDevices = append(zDev.XAALDevices, dev)
 			xaalDev := dev.getXAALDevice()
 			xaalDev.GroupID = grpAdd
-			gw.Engine.AddDevice(xaalDev)
 		}
 	}
 }