diff --git a/modules b/modules
index 0a18aa008ba83cf823a391fe86892bc593c8fe00..96b78b1d111ffca2c6e78fe2fe954fb3883cf85d 100644
--- a/modules
+++ b/modules
@@ -2,11 +2,11 @@ GLUON_FEEDS='packages routing gluon'
 
 OPENWRT_REPO=https://github.com/openwrt/openwrt.git
 OPENWRT_BRANCH=openwrt-23.05
-OPENWRT_COMMIT=cdc8470aecd03e6994714af092f030f209951de4
+OPENWRT_COMMIT=f4e4943d1ab6e38e3fcfc611d2665d5077a479b6
 
 PACKAGES_PACKAGES_REPO=https://github.com/openwrt/packages.git
 PACKAGES_PACKAGES_BRANCH=openwrt-23.05
-PACKAGES_PACKAGES_COMMIT=c92b5ece1620b30b577b5bc4b2216c8113ec13c1
+PACKAGES_PACKAGES_COMMIT=6526d607db81feb99bfa58e0be11e9b3a0c00cd9
 
 PACKAGES_ROUTING_REPO=https://github.com/openwrt/routing.git
 PACKAGES_ROUTING_BRANCH=openwrt-23.05
diff --git a/patches/openwrt/0005-kernel-bridge-Implement-MLD-Querier-wake-up-calls-Android-bug-workaround.patch b/patches/openwrt/0005-kernel-bridge-Implement-MLD-Querier-wake-up-calls-Android-bug-workaround.patch
index 487d4a9e36e90c03c4c4ae827bf78dea44585aa7..862c5241843de21d5c2f8bb44ad68fe8788873ef 100644
--- a/patches/openwrt/0005-kernel-bridge-Implement-MLD-Querier-wake-up-calls-Android-bug-workaround.patch
+++ b/patches/openwrt/0005-kernel-bridge-Implement-MLD-Querier-wake-up-calls-Android-bug-workaround.patch
@@ -27,10 +27,10 @@ Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
 
 diff --git a/package/network/config/netifd/patches/0001-bridge-Add-multicast_wakeupcall-option.patch b/package/network/config/netifd/patches/0001-bridge-Add-multicast_wakeupcall-option.patch
 new file mode 100644
-index 0000000000000000000000000000000000000000..a00a60d63d37d94cbba116eaa0f9640683ae7fa9
+index 0000000000000000000000000000000000000000..c9e3a2d4e4420387ae48cc5828d4284f2a987c3d
 --- /dev/null
 +++ b/package/network/config/netifd/patches/0001-bridge-Add-multicast_wakeupcall-option.patch
-@@ -0,0 +1,151 @@
+@@ -0,0 +1,199 @@
 +From d23a49e6542dc068b12fbc7b6a4520f9fb3626f9 Mon Sep 17 00:00:00 2001
 +From: =?UTF-8?q?Linus=20L=C3=BCssing?= <linus.luessing@c0d3.blue>
 +Date: Sun, 5 Jul 2020 23:33:51 +0200
@@ -70,11 +70,9 @@ index 0000000000000000000000000000000000000000..a00a60d63d37d94cbba116eaa0f96406
 + system-linux.c | 13 +++++++++++++
 + 3 files changed, 25 insertions(+)
 +
-+diff --git a/device.c b/device.c
-+index 1e892191d0ec..67111895b0f9 100644
 +--- a/device.c
 ++++ b/device.c
-+@@ -47,6 +47,7 @@ static const struct blobmsg_policy dev_attrs[__DEV_ATTR_MAX] = {
++@@ -47,6 +47,7 @@ static const struct blobmsg_policy dev_a
 + 	[DEV_ATTR_NEIGHGCSTALETIME] = { .name = "neighgcstaletime", .type = BLOBMSG_TYPE_INT32 },
 + 	[DEV_ATTR_DADTRANSMITS] = { .name = "dadtransmits", .type = BLOBMSG_TYPE_INT32 },
 + 	[DEV_ATTR_MULTICAST_TO_UNICAST] = { .name = "multicast_to_unicast", .type = BLOBMSG_TYPE_BOOL },
@@ -82,7 +80,7 @@ index 0000000000000000000000000000000000000000..a00a60d63d37d94cbba116eaa0f96406
 + 	[DEV_ATTR_MULTICAST_ROUTER] = { .name = "multicast_router", .type = BLOBMSG_TYPE_INT32 },
 + 	[DEV_ATTR_MULTICAST_FAST_LEAVE] = { .name = "multicast_fast_leave", . type = BLOBMSG_TYPE_BOOL },
 + 	[DEV_ATTR_MULTICAST] = { .name ="multicast", .type = BLOBMSG_TYPE_BOOL },
-+@@ -261,6 +262,7 @@ device_merge_settings(struct device *dev, struct device_settings *n)
++@@ -267,6 +268,7 @@ device_merge_settings(struct device *dev
 + 	n->multicast = s->flags & DEV_OPT_MULTICAST ?
 + 		s->multicast : os->multicast;
 + 	n->multicast_to_unicast = s->multicast_to_unicast;
@@ -90,7 +88,7 @@ index 0000000000000000000000000000000000000000..a00a60d63d37d94cbba116eaa0f96406
 + 	n->multicast_router = s->multicast_router;
 + 	n->multicast_fast_leave = s->multicast_fast_leave;
 + 	n->learning = s->learning;
-+@@ -386,6 +388,11 @@ device_init_settings(struct device *dev, struct blob_attr **tb)
++@@ -438,6 +440,11 @@ device_init_settings(struct device *dev,
 + 		s->flags |= DEV_OPT_MULTICAST_TO_UNICAST;
 + 	}
 + 
@@ -102,7 +100,7 @@ index 0000000000000000000000000000000000000000..a00a60d63d37d94cbba116eaa0f96406
 + 	if ((cur = tb[DEV_ATTR_MULTICAST_ROUTER])) {
 + 		s->multicast_router = blobmsg_get_u32(cur);
 + 		if (s->multicast_router <= 2)
-+@@ -1203,6 +1210,8 @@ device_dump_status(struct blob_buf *b, struct device *dev)
++@@ -1281,6 +1288,8 @@ device_dump_status(struct blob_buf *b, s
 + 			blobmsg_add_u32(b, "dadtransmits", st.dadtransmits);
 + 		if (st.flags & DEV_OPT_MULTICAST_TO_UNICAST)
 + 			blobmsg_add_u8(b, "multicast_to_unicast", st.multicast_to_unicast);
@@ -111,8 +109,6 @@ index 0000000000000000000000000000000000000000..a00a60d63d37d94cbba116eaa0f96406
 + 		if (st.flags & DEV_OPT_MULTICAST_ROUTER)
 + 			blobmsg_add_u32(b, "multicast_router", st.multicast_router);
 + 		if (st.flags & DEV_OPT_MULTICAST_FAST_LEAVE)
-+diff --git a/device.h b/device.h
-+index 6751628b9b33..41583ac3da4f 100644
 +--- a/device.h
 ++++ b/device.h
 +@@ -44,6 +44,7 @@ enum {
@@ -123,15 +119,15 @@ index 0000000000000000000000000000000000000000..a00a60d63d37d94cbba116eaa0f96406
 + 	DEV_ATTR_MULTICAST_ROUTER,
 + 	DEV_ATTR_MULTICAST_FAST_LEAVE,
 + 	DEV_ATTR_MULTICAST,
-+@@ -126,6 +127,7 @@ enum {
-+ 	DEV_OPT_ARP_ACCEPT		= (1ULL << 29),
-+ 	DEV_OPT_SPEED			= (1ULL << 30),
-+ 	DEV_OPT_DUPLEX			= (1ULL << 31),
-++	DEV_OPT_MULTICAST_WAKEUPCALL	= (1ULL << 63),
++@@ -137,6 +138,7 @@ enum {
++ 	DEV_OPT_RXPAUSE			= (1ULL << 34),
++ 	DEV_OPT_TXPAUSE			= (1ULL << 35),
++ 	DEV_OPT_AUTONEG			= (1ULL << 36),
+++	DEV_OPT_MULTICAST_WAKEUPCALL	= (1ULL << 63)
 + };
 + 
 + /* events broadcasted to all users of a device */
-+@@ -187,6 +189,7 @@ struct device_settings {
++@@ -198,6 +200,7 @@ struct device_settings {
 + 	int neigh4locktime;
 + 	unsigned int dadtransmits;
 + 	bool multicast_to_unicast;
@@ -139,11 +135,9 @@ index 0000000000000000000000000000000000000000..a00a60d63d37d94cbba116eaa0f96406
 + 	unsigned int multicast_router;
 + 	bool multicast_fast_leave;
 + 	bool multicast;
-+diff --git a/system-linux.c b/system-linux.c
-+index cc15537ba3ad..5148a7eacce0 100644
 +--- a/system-linux.c
 ++++ b/system-linux.c
-+@@ -534,6 +534,11 @@ static void system_bridge_set_multicast_to_unicast(struct device *dev, const cha
++@@ -536,6 +536,11 @@ static void system_bridge_set_multicast_
 + 	system_set_dev_sysfs("brport/multicast_to_unicast", dev->ifname, val);
 + }
 + 
@@ -155,7 +149,7 @@ index 0000000000000000000000000000000000000000..a00a60d63d37d94cbba116eaa0f96406
 + static void system_bridge_set_multicast_fast_leave(struct device *dev, const char *val)
 + {
 + 	system_set_dev_sysfs("brport/multicast_fast_leave", dev->ifname, val);
-+@@ -913,8 +918,10 @@ static char *system_get_bridge(const char *name, char *buf, int buflen)
++@@ -915,8 +920,10 @@ static char *system_get_bridge(const cha
 + static void
 + system_bridge_set_wireless(struct device *bridge, struct device *dev)
 + {
@@ -166,7 +160,7 @@ index 0000000000000000000000000000000000000000..a00a60d63d37d94cbba116eaa0f96406
 + 
 + 	if (dev->settings.flags & DEV_OPT_MULTICAST_TO_UNICAST)
 + 		mcast_to_ucast = dev->settings.multicast_to_unicast;
-+@@ -929,6 +936,12 @@ system_bridge_set_wireless(struct device *bridge, struct device *dev)
++@@ -931,6 +938,12 @@ system_bridge_set_wireless(struct device
 + 	system_bridge_set_multicast_to_unicast(dev, mcast_to_ucast ? "1" : "0");
 + 	system_bridge_set_hairpin_mode(dev, hairpin ? "1" : "0");
 + 	system_bridge_set_proxyarp_wifi(dev, dev->wireless_proxyarp ? "1" : "0");
@@ -179,11 +173,65 @@ index 0000000000000000000000000000000000000000..a00a60d63d37d94cbba116eaa0f96406
 + }
 + 
 + int system_bridge_addif(struct device *bridge, struct device *dev)
-+-- 
-+2.40.1
-+
++--- a/interface.c
+++++ b/interface.c
++@@ -1248,7 +1248,7 @@ interface_device_config_changed(struct i
++ 	struct blob_attr *ntb[__DEV_ATTR_MAX];
++ 	struct blob_attr *otb[__DEV_ATTR_MAX];
++ 	struct device *dev = if_old->main_dev.dev;
++-	unsigned long diff = 0;
+++	unsigned long diff[2] = {};
++ 
++ 	BUILD_BUG_ON(sizeof(diff) < __DEV_ATTR_MAX / 8);
++ 
++@@ -1267,8 +1267,8 @@ interface_device_config_changed(struct i
++ 	blobmsg_parse(device_attr_list.params, __DEV_ATTR_MAX, ntb,
++ 		blob_data(if_new->config), blob_len(if_new->config));
++ 
++-	uci_blob_diff(ntb, otb, &device_attr_list, &diff);
++-	return diff;
+++	uci_blob_diff(ntb, otb, &device_attr_list, diff);
+++	return diff[0] | diff[1];
++ }
++ 
++ static void
++--- a/bonding.c
+++++ b/bonding.c
++@@ -442,7 +442,7 @@ bonding_reload(struct device *dev, struc
++ 	struct blob_attr *tb_dev[__DEV_ATTR_MAX];
++ 	struct blob_attr *tb_b[__BOND_ATTR_MAX];
++ 	enum dev_change_type ret = DEV_CONFIG_APPLIED;
++-	unsigned long diff;
+++	unsigned long diff[2];
++ 	struct bonding_device *bdev;
++ 
++ 	BUILD_BUG_ON(sizeof(diff) < __BOND_ATTR_MAX / 8);
++@@ -472,17 +472,17 @@ bonding_reload(struct device *dev, struc
++ 		blobmsg_parse(device_attr_list.params, __DEV_ATTR_MAX, otb_dev,
++ 			blob_data(bdev->config_data), blob_len(bdev->config_data));
++ 
++-		diff = 0;
++-		uci_blob_diff(tb_dev, otb_dev, &device_attr_list, &diff);
++-		if (diff)
+++		diff[0] = diff[1] = 0;
+++		uci_blob_diff(tb_dev, otb_dev, &device_attr_list, diff);
+++		if (diff[0] | diff[1])
++ 		    ret = DEV_CONFIG_RESTART;
++ 
++ 		blobmsg_parse(bonding_attrs, __BOND_ATTR_MAX, otb_b,
++ 			blob_data(bdev->config_data), blob_len(bdev->config_data));
++ 
++-		diff = 0;
++-		uci_blob_diff(tb_b, otb_b, &bonding_attr_list, &diff);
++-		if (diff & ~(1 << BOND_ATTR_PORTS))
+++		diff[0] = diff[1] = 0;
+++		uci_blob_diff(tb_b, otb_b, &bonding_attr_list, diff);
+++		if (diff[0] & ~(1 << BOND_ATTR_PORTS))
++ 		    ret = DEV_CONFIG_RESTART;
++ 
++ 		bonding_config_init(dev);
 diff --git a/target/linux/generic/config-5.15 b/target/linux/generic/config-5.15
-index 6f28147ee3a0af3611fc108d0534207a4334a6de..476f0d1a6a3c3da1458d71b53214d27a276a1fcc 100644
+index 214a1e6ecd83c067b96cb55ad052ae00b82fa8b5..bf6709ae2dbb87a21659558161d4882befd88b49 100644
 --- a/target/linux/generic/config-5.15
 +++ b/target/linux/generic/config-5.15
 @@ -761,6 +761,7 @@ CONFIG_BRIDGE=y