diff --git a/net/mwan3/Makefile b/net/mwan3/Makefile
index 99990e4cc..3b853e6ea 100644
--- a/net/mwan3/Makefile
+++ b/net/mwan3/Makefile
@@ -8,7 +8,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=mwan3
-PKG_VERSION:=2.10.1
+PKG_VERSION:=2.10.2
 PKG_RELEASE:=1
 PKG_MAINTAINER:=Florian Eckert <fe@dev.tdt.de>
 PKG_LICENSE:=GPL-2.0
@@ -63,12 +63,52 @@ exit 0
 endef
 
 define Build/Compile
-	$(TARGET_CC) $(CFLAGS) $(LDFLAGS) $(FPIC) -shared -o $(PKG_BUILD_DIR)/libwrap_mwan3_sockopt.so.1.0 $(if $(CONFIG_IPV6),-DCONFIG_IPV6) $(PKG_BUILD_DIR)/sockopt_wrap.c -ldl
+	$(TARGET_CC) $(CFLAGS) $(LDFLAGS) $(FPIC) \
+		-shared \
+		-o $(PKG_BUILD_DIR)/libwrap_mwan3_sockopt.so.1.0 \
+		$(if $(CONFIG_IPV6),-DCONFIG_IPV6) \
+		$(PKG_BUILD_DIR)/sockopt_wrap.c \
+		-ldl
 endef
 
 define Package/mwan3/install
-	$(CP) ./files/* $(1)
+	$(INSTALL_DIR) $(1)/etc/config
+	$(INSTALL_CONF) ./files/etc/config/mwan3 \
+		$(1)/etc/config/
+
+	$(INSTALL_DIR) $(1)/etc/hotplug.d/iface
+	$(INSTALL_DATA) ./files/etc/hotplug.d/iface/15-mwan3 \
+		$(1)/etc/hotplug.d/iface/
+	$(INSTALL_DATA) ./files/etc/hotplug.d/iface/16-mwan3-user \
+		$(1)/etc/hotplug.d/iface/
+
+	$(INSTALL_DIR) $(1)/etc/init.d
+	$(INSTALL_BIN) ./files/etc/init.d/mwan3 \
+		$(1)/etc/init.d/
+
+	$(INSTALL_DIR) $(1)/lib/mwan3
+	$(INSTALL_DATA) ./files/lib/mwan3/common.sh \
+		$(1)/lib/mwan3/
+	$(INSTALL_DATA) ./files/lib/mwan3/mwan3.sh \
+		$(1)/lib/mwan3/
+
+	$(INSTALL_DIR) $(1)/usr/libexec/rpcd
+	$(INSTALL_BIN) ./files/usr/libexec/rpcd/mwan3 \
+		$(1)/usr/libexec/rpcd/
+
+	$(INSTALL_DIR) $(1)/usr/sbin
+	$(INSTALL_BIN) ./files/usr/sbin/mwan3 \
+		$(1)/usr/sbin/
+	$(INSTALL_BIN) ./files/usr/sbin/mwan3rtmon \
+		$(1)/usr/sbin/
+	$(INSTALL_BIN) ./files/usr/sbin/mwan3track \
+		$(1)/usr/sbin/
+
 	$(CP) $(PKG_BUILD_DIR)/libwrap_mwan3_sockopt.so.1.0 $(1)/lib/mwan3/
+
+	$(INSTALL_DIR) $(1)/etc/uci-defaults
+	$(INSTALL_DATA) ./files/etc/uci-defaults/mwan3-migrate-flush_conntrack \
+		$(1)/etc/uci-defaults/
 endef
 
 $(eval $(call BuildPackage,mwan3))
diff --git a/net/mwan3/files/etc/hotplug.d/iface/15-mwan3 b/net/mwan3/files/etc/hotplug.d/iface/15-mwan3
index 320e7f787..f1755d26f 100644
--- a/net/mwan3/files/etc/hotplug.d/iface/15-mwan3
+++ b/net/mwan3/files/etc/hotplug.d/iface/15-mwan3
@@ -3,9 +3,12 @@
 . /lib/functions.sh
 . /lib/functions/network.sh
 . /lib/mwan3/mwan3.sh
-. /usr/share/libubox/jshn.sh
 . /lib/mwan3/common.sh
 
+initscript=/etc/init.d/mwan3
+. /lib/functions/procd.sh
+
+
 SCRIPTNAME="mwan3-hotplug"
 [ "$ACTION" = "ifup" ] || [ "$ACTION" = "ifdown" ] || [ "$ACTION" = "connected" ] || [ "$ACTION" = "disconnected" ] || exit 1
 [ -n "$INTERFACE" ] || exit 2
@@ -16,18 +19,17 @@ if { [ "$ACTION" = "ifup" ] || [ "$ACTION" = "connected" ] ; } && [ -z "$DEVICE"
 	exit 3
 fi
 
-[ "$MWAN3_STARTUP" = 1 ] || mwan3_lock "$ACTION" "$INTERFACE"
+[ "$MWAN3_STARTUP" = 1 ] || procd_lock
 
 config_load mwan3
 /etc/init.d/mwan3 running || {
-	[ "$MWAN3_STARTUP" = 1 ] || mwan3_unlock "$ACTION" "$INTERFACE"
+	[ "$MWAN3_STARTUP" = "init" ] || procd_lock
 	LOG notice "mwan3 hotplug $ACTION on $INTERFACE not called because globally disabled"
 	mwan3_flush_conntrack "$INTERFACE" "$ACTION"
 	exit 0
 }
 
 $IPT4 -S mwan3_hook &>/dev/null || {
-	mwan3_unlock "$ACTION" "$INTERFACE"
 	LOG warn "hotplug called on $INTERFACE before mwan3 has been set up"
 	exit 0
 }
@@ -44,7 +46,6 @@ fi
 
 config_get_bool enabled $INTERFACE 'enabled' '0'
 [ "${enabled}" -eq 1 ] || {
-	[ "$MWAN3_STARTUP" = 1 ] || mwan3_unlock "$ACTION" "$INTERFACE"
 	LOG notice "mwan3 hotplug on $INTERFACE not called because interface disabled"
 	exit 0
 }
@@ -57,11 +58,6 @@ else
 	status=online
 fi
 
-if [ "$ACTION" = ifup ] || [ "$ACTION" = ifdown ]; then
-	initscript=/etc/init.d/mwan3
-	. /lib/functions/procd.sh
-fi
-
 LOG notice "Execute $ACTION event on interface $INTERFACE (${DEVICE:-unknown})"
 
 case "$ACTION" in
@@ -73,8 +69,9 @@ case "$ACTION" in
 		mwan3_create_iface_iptables $INTERFACE $DEVICE
 		mwan3_create_iface_rules $INTERFACE $DEVICE
 		mwan3_set_iface_hotplug_state $INTERFACE "$status"
-		if [ "$MWAN3_STARTUP" != 1 ]; then
+		if [ "$MWAN3_STARTUP" = "cmd" ]; then
 			mwan3_create_iface_route $INTERFACE $DEVICE
+	                mwan3_set_general_rules
 			[ "$status" = "online" ] && mwan3_set_policies_iptables
 		fi
 		[ "$ACTION" = ifup ] && procd_running mwan3 "track_$INTERFACE" && procd_send_signal mwan3 "track_$INTERFACE" USR2
@@ -93,5 +90,4 @@ case "$ACTION" in
 		mwan3_set_policies_iptables
 	;;
 esac
-[ "$MWAN3_STARTUP" = 1 ] || mwan3_unlock "$ACTION" "$INTERFACE"
 exit 0
diff --git a/net/mwan3/files/etc/hotplug.d/iface/16-mwan3-user b/net/mwan3/files/etc/hotplug.d/iface/16-mwan3-user
index 698fe0909..be857e8ff 100644
--- a/net/mwan3/files/etc/hotplug.d/iface/16-mwan3-user
+++ b/net/mwan3/files/etc/hotplug.d/iface/16-mwan3-user
@@ -3,11 +3,12 @@
 [ -f "/etc/mwan3.user" ] && {
 	. /lib/functions.sh
 	. /lib/mwan3/mwan3.sh
+        initscript=/etc/init.d/mwan3
+	. /lib/functions/procd.sh
 
-	[ "$MWAN3_SHUTDOWN" != 1 ] && mwan3_lock "$ACTION" "$DEVICE-user"
+	[ "$MWAN3_SHUTDOWN" != 1 ] && procd_lock
 
 	[ "$MWAN3_SHUTDOWN" != 1 ] && ! /etc/init.d/mwan3 running && {
-		mwan3_unlock "$ACTION" "$DEVICE-user"
 		exit 0
 	}
 
@@ -19,8 +20,6 @@
 		exit 0
 	}
 
-	[ "$MWAN3_SHUTDOWN" != 1 ] && mwan3_unlock "$ACTION" "$DEVICE-user"
-
 	env -i ACTION="$ACTION" INTERFACE="$INTERFACE" DEVICE="$DEVICE" \
 		/bin/sh /etc/mwan3.user
 }
diff --git a/net/mwan3/files/etc/init.d/mwan3 b/net/mwan3/files/etc/init.d/mwan3
old mode 100755
new mode 100644
index b7cf91eb1..23c21ab5d
--- a/net/mwan3/files/etc/init.d/mwan3
+++ b/net/mwan3/files/etc/init.d/mwan3
@@ -31,20 +31,16 @@ start_service() {
 	mwan3_init
 	config_foreach start_tracker interface
 
-	mwan3_lock "command" "mwan3"
-
 	mwan3_update_iface_to_table
 	mwan3_set_connected_ipset
 	mwan3_set_custom_ipset
 	mwan3_set_general_rules
 	mwan3_set_general_iptables
-	config_foreach mwan3_ifup interface 1
+	config_foreach mwan3_ifup interface "init"
 	wait $hotplug_pids
 	mwan3_set_policies_iptables
 	mwan3_set_user_rules
 
-	mwan3_unlock "command" "mwan3"
-
 	procd_open_instance rtmon_ipv4
 	procd_set_param command /usr/sbin/mwan3rtmon ipv4
 	procd_set_param respawn
@@ -61,8 +57,6 @@ start_service() {
 stop_service() {
 	local ipset rule IP IPTR IPT family table tid
 
-	mwan3_lock "command" "mwan3"
-
 	config_load mwan3
 	mwan3_init
 	config_foreach mwan3_interface_shutdown interface
@@ -108,7 +102,6 @@ stop_service() {
 
 	rm -rf $MWAN3_STATUS_DIR $MWAN3TRACK_STATUS_DIR
 
-	mwan3_unlock "command" "mwan3"
 }
 
 reload_service() {
diff --git a/net/mwan3/files/lib/mwan3/mwan3.sh b/net/mwan3/files/lib/mwan3/mwan3.sh
index e6e43ebe8..43740e2de 100644
--- a/net/mwan3/files/lib/mwan3/mwan3.sh
+++ b/net/mwan3/files/lib/mwan3/mwan3.sh
@@ -103,16 +103,6 @@ mwan3_count_one_bits()
 	echo $count
 }
 
-mwan3_lock() {
-	lock /var/run/mwan3.lock
-	#LOG debug "$1 $2 (lock)"
-}
-
-mwan3_unlock() {
-	#LOG debug "$1 $2 (unlock)"
-	lock -u /var/run/mwan3.lock
-}
-
 mwan3_get_iface_id()
 {
 	local _tmp
@@ -965,12 +955,12 @@ mwan3_interface_shutdown()
 
 mwan3_ifup()
 {
-	local up l3_device status interface true_iface mwan3_startup
+	local interface=$1
+	local caller=$2
 
-	interface=$1
-	mwan3_startup=$2
+	local up l3_device status true_iface
 
-	if [ "${mwan3_startup}" != 1 ]; then
+	if [ "${caller}" = "cmd" ]; then
 		# It is not necessary to obtain a lock here, because it is obtained in the hotplug
 		# script, but we still want to do the check to print a useful error message
 		/etc/init.d/mwan3 running || {
@@ -989,7 +979,7 @@ mwan3_ifup()
 	}
 	hotplug_startup()
 	{
-		env -i MWAN3_STARTUP=$mwan3_startup ACTION=ifup \
+		env -i MWAN3_STARTUP=$caller ACTION=ifup \
 		    INTERFACE=$interface DEVICE=$l3_device \
 		    sh /etc/hotplug.d/iface/15-mwan3
 	}
@@ -998,7 +988,7 @@ mwan3_ifup()
 		return
 	fi
 
-	if [ "${mwan3_startup}" = 1 ]; then
+	if [ "${caller}" = "init" ]; then
 		hotplug_startup &
 		hotplug_pids="$hotplug_pids $!"
 	else
diff --git a/net/mwan3/files/usr/libexec/rpcd/mwan3 b/net/mwan3/files/usr/libexec/rpcd/mwan3
old mode 100755
new mode 100644
diff --git a/net/mwan3/files/usr/sbin/mwan3 b/net/mwan3/files/usr/sbin/mwan3
old mode 100755
new mode 100644
index 45776bdfc..803e74b9a
--- a/net/mwan3/files/usr/sbin/mwan3
+++ b/net/mwan3/files/usr/sbin/mwan3
@@ -54,7 +54,7 @@ ifup() {
 		exit 0
 	fi
 
-	mwan3_ifup "$1"
+	mwan3_ifup "$1" "cmd"
 }
 
 interfaces()
diff --git a/net/mwan3/files/usr/sbin/mwan3rtmon b/net/mwan3/files/usr/sbin/mwan3rtmon
old mode 100755
new mode 100644
index 569b4d172..6ece58125
--- a/net/mwan3/files/usr/sbin/mwan3rtmon
+++ b/net/mwan3/files/usr/sbin/mwan3rtmon
@@ -159,16 +159,13 @@ main()
 		IP="$IP4"
 	fi
 	mwan3_init
-	mwan3_lock "mwan3rtmon" "start"
 	sh -c "echo \$\$; exec $IP monitor route" | {
 		read -r monitor_pid
 		trap_with_arg func_trap "$monitor_pid" SIGINT SIGTERM SIGKILL
 		while IFS='' read -r line; do
 			[ -z "${line##*table*}" ] && continue
 			LOG debug "handling route update $family '$line'"
-			mwan3_lock "service" "mwan3rtmon"
 			mwan3_rtmon_route_handle "$line" "$family"
-			mwan3_unlock "service" "mwan3rtmon"
 		done
 	} &
 	child=$!
@@ -176,7 +173,6 @@ main()
 	trap_with_arg func_trap "$child" SIGINT SIGTERM SIGKILL
 	mwan3_set_connected_${family}
 	mwan3_add_all_routes ${family}
-	mwan3_unlock "mwan3rtmon" "start"
 	kill -SIGCONT $child
 	wait $!
 }
diff --git a/net/mwan3/files/usr/sbin/mwan3track b/net/mwan3/files/usr/sbin/mwan3track
old mode 100755
new mode 100644
index d97933e09..d4a5f44ab
--- a/net/mwan3/files/usr/sbin/mwan3track
+++ b/net/mwan3/files/usr/sbin/mwan3track
@@ -9,9 +9,6 @@ DEVICE=""
 
 IFDOWN_EVENT=0
 IFUP_EVENT=0
-TRACK_OUTPUT=$MWAN3TRACK_STATUS_DIR/$INTERFACE/TRACK_OUTPUT
-
-mwan3_init
 
 stop_subprocs() {
 	[ -n "$SLEEP_PID" ] && kill "$SLEEP_PID" && unset SLEEP_PID
@@ -169,6 +166,10 @@ main() {
 	INTERFACE=$1
 	STATUS=""
 	STARTED=0
+	TRACK_OUTPUT=$MWAN3TRACK_STATUS_DIR/$INTERFACE/TRACK_OUTPUT
+
+	mwan3_init
+
 	mkdir -p $MWAN3TRACK_STATUS_DIR/$INTERFACE
 
 	trap clean_up TERM
@@ -345,7 +346,7 @@ main() {
 		get_uptime > $MWAN3TRACK_STATUS_DIR/$INTERFACE/TIME
 
 		host_up_count=0
-		if [ "${IFDOWN_EVENT}" -ne 0 ] && [ "${IFUP_EVENT}" -ne 0 ]; then
+		if [ "${IFDOWN_EVENT}" -eq 0 ] && [ "${IFUP_EVENT}" -eq 0 ]; then
 			sleep "${sleep_time}" &
 			SLEEP_PID=$!
 			wait