diff --git a/package/gluon-l3roamd/files/etc/init.d/gluon-l3roamd b/package/gluon-l3roamd/files/etc/init.d/gluon-l3roamd
index c64f3b1d8b5a1e2a7e841cb9d859420ceca1299d..fb1ecdfc04897bb053c4bbc85bad6db368716da7 100755
--- a/package/gluon-l3roamd/files/etc/init.d/gluon-l3roamd
+++ b/package/gluon-l3roamd/files/etc/init.d/gluon-l3roamd
@@ -5,10 +5,39 @@ START=55
 USE_PROCD=1
 PROG=/usr/sbin/l3roamd
 
+echotol3roamd() {
+	local count=0
+	local line="$1"
+	while ! (echo -e "$line" | uc /var/run/l3roamd.sock >/dev/null 2>&1)
+	do
+		sleep 1
+		echo retrying to connect to l3roamd in PID $$, waited ${count}s >&2
+		count=$((count+1))
+	done
+	return 0
+}
+
+
+
+reload_service() {
+	for i in $(ubus call network.interface dump | jsonfilter -e "@.interface[@.proto='gluon_mesh' && @.up=true].device")
+	do
+		echotol3roamd "add_meshif $i"
+	done
+
+	for i in $(echotol3roamd "get_meshifs"| jsonfilter -e "@.mesh_interfaces[@]")
+	do
+		if ! ubus call network.interface dump | jsonfilter -e "@.interface[@.proto='gluon_mesh' && @.up=true].device"|grep -q $i
+		then
+			echotol3roamd "del_meshif $i"
+		fi
+	done
+}
+
 start_service () {
 	local interfaces=$(
-		for dev in $(gluon-list-mesh-interfaces); do echo " -m $dev"; done
-		[ "$(ifstatus local_node | jsonfilter -e '@.up')" = 'true' ] && echo ' -i local-node'
+	for dev in $(gluon-list-mesh-interfaces); do echo " -m $dev"; done
+	[ "$(ifstatus local_node | jsonfilter -e '@.up')" = 'true' ] && echo ' -i local-node'
 	)
 	/sbin/sysctl -w net.ipv6.neigh.default.gc_thresh1=2
 	/sbin/sysctl -w net.ipv4.neigh.default.gc_thresh1=2