diff --git a/package/gluon-setup-mode/files/etc/init.d/gluon-setup-mode b/package/gluon-setup-mode/files/etc/init.d/gluon-setup-mode
deleted file mode 100755
index 41c14fd2a2131b487c2cf4a561f05cddcf3fe01b..0000000000000000000000000000000000000000
--- a/package/gluon-setup-mode/files/etc/init.d/gluon-setup-mode
+++ /dev/null
@@ -1,88 +0,0 @@
-#!/bin/sh /etc/rc.common
-
-START=15
-
-
-SETUP_MODE_ADDR=192.168.1.1
-SETUP_MODE_NETMASK=255.255.255.0
-
-SETUP_MODE_DHCP_RANGE=192.168.1.2,192.168.1.254
-
-
-delete_interface() {
-	[ "$1" = 'loopback' ] || uci_remove network "$1"
-}
-
-
-check_enable() {
-	config_get enabled "$1" enabled
-	config_get configured "$1" configured
-
-	if [ "$enabled" = 1 -o "$configured" != 1 ]; then
-		export enable=1
-	fi
-}
-
-setup_network() {
-	(
-		export UCI_CONFIG_DIR=/var/gluon/setup-mode/config
-
-		mkdir -p "$UCI_CONFIG_DIR"
-
-		cp /etc/config/network "$UCI_CONFIG_DIR"
-
-		config_load network
-		config_foreach delete_interface interface
-
-		uci_add network interface setup
-		uci_set network setup ifname "$(lua -e 'print(require("gluon.sysconfig").setup_ifname)')"
-		uci_set network setup type 'bridge'
-		uci_set network setup proto 'static'
-		uci_set network setup ipaddr "$SETUP_MODE_ADDR"
-		uci_set network setup netmask "$SETUP_MODE_NETMASK"
-
-		uci_commit network
-
-		SERVICE_DAEMONIZE=1
-		SERVICE_WRITE_PID=1
-		service_start /sbin/netifd -c "$UCI_CONFIG_DIR"
-
-		setup_switch() { return 0; }
-
-		include /lib/network
-		setup_switch
-	)
-}
-
-start() {
-	enable=0
-	config_load gluon-setup-mode
-	config_foreach check_enable setup_mode
-
-	if [ "$enable" = '1' ]; then
-		lua -luci -e 'require "luci.model.uci"; uci_state=luci.model.uci.cursor_state(); uci_state:section("gluon-setup-mode", "setup_mode", nil, { running = "1" }); uci_state:save("gluon-setup-mode")'
-		uci set 'gluon-setup-mode.@setup_mode[0].enabled=0'
-		uci commit gluon-setup-mode
-
-		setup_network
-
-		/usr/sbin/telnetd -l /lib/gluon/setup-mode/ash-login
-		/etc/init.d/dropbear start
-
-		/usr/sbin/uhttpd -h /lib/gluon/setup-mode/www -x /cgi-bin -A 1 -R -p 0.0.0.0:80
-
-		/usr/sbin/dnsmasq -p 0 -F $SETUP_MODE_DHCP_RANGE -l /tmp/dhcp.leases -O option:router
-
-		/etc/init.d/led start
-
-		# correctly finish firstboot
-		/etc/init.d/done boot
-
-		. /etc/diag.sh
-		get_status_led
-		status_led_set_timer 1000 300
-
-		# block further boot
-		while true; do sleep 1; done
-	fi
-}
diff --git a/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/K50dropbear b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/K50dropbear
new file mode 120000
index 0000000000000000000000000000000000000000..066549b3aabb4255cab1d3ffd1db5a65c9a01a38
--- /dev/null
+++ b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/K50dropbear
@@ -0,0 +1 @@
+/etc/init.d/dropbear
\ No newline at end of file
diff --git a/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/K89log b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/K89log
new file mode 120000
index 0000000000000000000000000000000000000000..1e0c5ac02e7d9c3a8be6e85002a2ab61767c0a09
--- /dev/null
+++ b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/K89log
@@ -0,0 +1 @@
+/etc/init.d/log
\ No newline at end of file
diff --git a/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/K90network b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/K90network
new file mode 120000
index 0000000000000000000000000000000000000000..0a43e66b8f035ecc09b334ecf2299665203ee9e8
--- /dev/null
+++ b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/K90network
@@ -0,0 +1 @@
+S20network
\ No newline at end of file
diff --git a/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/K98boot b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/K98boot
new file mode 120000
index 0000000000000000000000000000000000000000..64aea5e82fac99bff0ce8961ef3cbbb208e013e8
--- /dev/null
+++ b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/K98boot
@@ -0,0 +1 @@
+/etc/init.d/boot
\ No newline at end of file
diff --git a/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/K99umount b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/K99umount
new file mode 120000
index 0000000000000000000000000000000000000000..b02f4892fa6433b27182dc135916ebf1e720d92e
--- /dev/null
+++ b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/K99umount
@@ -0,0 +1 @@
+/etc/init.d/umount
\ No newline at end of file
diff --git a/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S00sysfixtime b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S00sysfixtime
new file mode 120000
index 0000000000000000000000000000000000000000..a4fb1d5bd88ca445c4c62882ffe50bb5ce367382
--- /dev/null
+++ b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S00sysfixtime
@@ -0,0 +1 @@
+/etc/init.d/sysfixtime
\ No newline at end of file
diff --git a/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S10boot b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S10boot
new file mode 120000
index 0000000000000000000000000000000000000000..64aea5e82fac99bff0ce8961ef3cbbb208e013e8
--- /dev/null
+++ b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S10boot
@@ -0,0 +1 @@
+/etc/init.d/boot
\ No newline at end of file
diff --git a/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S10system b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S10system
new file mode 120000
index 0000000000000000000000000000000000000000..81e8836ff672df99397ffb23d0cf69884268430c
--- /dev/null
+++ b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S10system
@@ -0,0 +1 @@
+/etc/init.d/system
\ No newline at end of file
diff --git a/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S11sysctl b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S11sysctl
new file mode 120000
index 0000000000000000000000000000000000000000..b4ac535e9157932ba0f60da9313d277a1c723b14
--- /dev/null
+++ b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S11sysctl
@@ -0,0 +1 @@
+/etc/init.d/sysctl
\ No newline at end of file
diff --git a/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S12log b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S12log
new file mode 120000
index 0000000000000000000000000000000000000000..1e0c5ac02e7d9c3a8be6e85002a2ab61767c0a09
--- /dev/null
+++ b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S12log
@@ -0,0 +1 @@
+/etc/init.d/log
\ No newline at end of file
diff --git a/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S13haveged b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S13haveged
new file mode 100755
index 0000000000000000000000000000000000000000..b4af677a51a190e43a81cfddb2c3a3fc9dfb9f73
--- /dev/null
+++ b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S13haveged
@@ -0,0 +1,5 @@
+#!/bin/sh /etc/rc.common
+
+if /etc/init.d/haveged enabled; then
+	. /etc/init.d/haveged
+fi
diff --git a/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S15gluon-setup-mode b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S15gluon-setup-mode
new file mode 100755
index 0000000000000000000000000000000000000000..b6c1136ef8db8dcf00f334d70c874635163ed4cf
--- /dev/null
+++ b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S15gluon-setup-mode
@@ -0,0 +1,10 @@
+#!/bin/sh /etc/rc.common
+
+START=15
+
+
+boot() {
+	lua -luci -e 'require "luci.model.uci"; uci_state=luci.model.uci.cursor_state(); uci_state:section("gluon-setup-mode", "setup_mode", nil, { running = "1" }); uci_state:save("gluon-setup-mode")'
+	uci set 'gluon-setup-mode.@setup_mode[0].enabled=0'
+	uci commit gluon-setup-mode
+}
diff --git a/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S20network b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S20network
new file mode 100755
index 0000000000000000000000000000000000000000..8bc0ba4f51ccd0a9cc7588cf16c16a36c418c449
--- /dev/null
+++ b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S20network
@@ -0,0 +1,86 @@
+#!/bin/sh /etc/rc.common
+
+SETUP_MODE_ADDR=192.168.1.1
+SETUP_MODE_NETMASK=255.255.255.0
+
+START=20
+STOP=90
+
+USE_PROCD=1
+
+
+delete_interface() {
+        [ "$1" = 'loopback' ] || uci_remove network "$1"
+}
+
+prepare_config() {
+(
+	export UCI_CONFIG_DIR=/var/gluon/setup-mode/config
+
+	mkdir -p "$UCI_CONFIG_DIR"
+
+	cp /etc/config/network "$UCI_CONFIG_DIR"
+
+	config_load network
+	config_foreach delete_interface interface
+
+	uci_add network interface setup
+	uci_set network setup ifname "$(lua -e 'print(require("gluon.sysconfig").setup_ifname)')"
+	uci_set network setup type 'bridge'
+	uci_set network setup proto 'static'
+	uci_set network setup ipaddr "$SETUP_MODE_ADDR"
+	uci_set network setup netmask "$SETUP_MODE_NETMASK"
+
+	uci_commit network
+)
+}
+
+init_switch() {
+	setup_switch() { return 0; }
+
+	include /lib/network
+	setup_switch
+}
+
+start_service() {
+	prepare_config
+	init_switch
+
+	procd_open_instance
+	procd_set_param command /sbin/netifd -c /var/gluon/setup-mode/config
+	procd_set_param respawn
+	procd_set_param watch network.interface
+	[ -e /proc/sys/kernel/core_pattern ] && {
+		procd_set_param limits core="unlimited"
+		echo '/tmp/%e.%p.%s.%t.core' > /proc/sys/kernel/core_pattern
+	}
+	procd_close_instance
+}
+
+reload_service() {
+	init_switch
+	ubus call network reload
+	/sbin/wifi reload_legacy
+}
+
+stop_service() {
+	/sbin/wifi down
+}
+
+service_running() {
+	ubus -t 30 wait_for network.interface
+	/sbin/wifi reload_legacy
+}
+
+restart() {
+	ifdown -a
+	sleep 1
+	trap '' TERM
+	stop "$@"
+	start "$@"
+}
+
+shutdown() {
+	ifdown -a
+	stop
+}
diff --git a/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S50dropbear b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S50dropbear
new file mode 120000
index 0000000000000000000000000000000000000000..066549b3aabb4255cab1d3ffd1db5a65c9a01a38
--- /dev/null
+++ b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S50dropbear
@@ -0,0 +1 @@
+/etc/init.d/dropbear
\ No newline at end of file
diff --git a/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S50telnet b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S50telnet
new file mode 100755
index 0000000000000000000000000000000000000000..b524b2cec41f17ec686dfc26048975c17f4e2de1
--- /dev/null
+++ b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S50telnet
@@ -0,0 +1,12 @@
+#!/bin/sh /etc/rc.common
+
+START=50
+
+USE_PROCD=1
+PROG=/usr/sbin/telnetd
+
+start_service() {
+	procd_open_instance
+	procd_set_param command "$PROG" -F -l /lib/gluon/setup-mode/ash-login
+	procd_close_instance
+}
diff --git a/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S50uhttpd b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S50uhttpd
new file mode 100755
index 0000000000000000000000000000000000000000..53118704b2030f8183681889b6e2b66241e5bda7
--- /dev/null
+++ b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S50uhttpd
@@ -0,0 +1,14 @@
+#!/bin/sh /etc/rc.common
+
+START=50
+
+USE_PROCD=1
+
+UHTTPD_BIN="/usr/sbin/uhttpd"
+
+start_service() {
+	procd_open_instance
+	procd_set_param respawn
+	procd_set_param command "$UHTTPD_BIN" -f -h /lib/gluon/setup-mode/www -x /cgi-bin -A 1 -R -p 0.0.0.0:80
+	procd_close_instance
+}
diff --git a/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S60dnsmasq b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S60dnsmasq
new file mode 100755
index 0000000000000000000000000000000000000000..d275b4bf0b1425eb8913e6621297e1e2a425d1c0
--- /dev/null
+++ b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S60dnsmasq
@@ -0,0 +1,17 @@
+#!/bin/sh /etc/rc.common
+
+SETUP_MODE_DHCP_RANGE=192.168.1.2,192.168.1.254
+
+
+START=60
+
+USE_PROCD=1
+PROG=/usr/sbin/dnsmasq
+
+
+start_service() {
+	procd_open_instance
+	procd_set_param command $PROG -k -p 0 -F $SETUP_MODE_DHCP_RANGE -l /tmp/dhcp.leases -O option:router
+	procd_set_param respawn
+	procd_close_instance
+}
diff --git a/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S95done b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S95done
new file mode 120000
index 0000000000000000000000000000000000000000..c9f302775486b577a2f264f46b19e4e7acef691d
--- /dev/null
+++ b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S95done
@@ -0,0 +1 @@
+/etc/init.d/done
\ No newline at end of file
diff --git a/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S96led b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S96led
new file mode 100755
index 0000000000000000000000000000000000000000..d5375acb43bced928d341babb131ecf3a216a751
--- /dev/null
+++ b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S96led
@@ -0,0 +1,9 @@
+#!/bin/sh /etc/rc.common
+
+START=96
+
+start() {
+	. /etc/diag.sh
+	get_status_led
+	status_led_set_timer 1000 300
+}
diff --git a/package/gluon-setup-mode/files/lib/preinit/90_setup_mode b/package/gluon-setup-mode/files/lib/preinit/90_setup_mode
new file mode 100644
index 0000000000000000000000000000000000000000..31f64f643f7e4fa3ee6d8921c704a9bc484dc60f
--- /dev/null
+++ b/package/gluon-setup-mode/files/lib/preinit/90_setup_mode
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+
+check_enable() {
+	local enabled
+	local configured
+
+        config_get enabled "$1" enabled
+        config_get configured "$1" configured
+
+        if [ "$enabled" = 1 -o "$configured" != 1 ]; then
+		echo '/lib/gluon/setup-mode/rc.d' > /tmp/rc_d_path
+        fi
+}
+
+
+setup_mode_enable() {
+        config_load gluon-setup-mode
+        config_foreach check_enable setup_mode
+}
+
+boot_hook_add preinit_main setup_mode_enable