diff --git a/target/linux/ipq806x/base-files/etc/diag.sh b/target/linux/ipq806x/base-files/etc/diag.sh
index 0bf5934ae190377c436640b90a43b107856c138d..7c9a9d082c839d5f2fdf3fcf2614e45276a14f37 100755
--- a/target/linux/ipq806x/base-files/etc/diag.sh
+++ b/target/linux/ipq806x/base-files/etc/diag.sh
@@ -1,34 +1,45 @@
 #!/bin/sh
+# Copyright (C) 2016 Henryk Heisig hyniu@o2.pl
 
 . /lib/functions/leds.sh
 . /lib/ipq806x.sh
 
-get_status_led() {
-	case $(ipq806x_board_name) in
-	c2600)
-		status_led="c2600:blue:status"
-		;;
-	ea8500)
-		status_led="ea8500:white:power"
-		;;
-	esac
-}
+boot="$(ipq806x_get_dt_led boot)"
+failsafe="$(ipq806x_get_dt_led failsafe)"
+running="$(ipq806x_get_dt_led running)"
+upgrade="$(ipq806x_get_dt_led upgrade)"
 
 set_state() {
-	get_status_led
+	status_led="$boot"
 
 	case "$1" in
 	preinit)
 		status_led_blink_preinit
 		;;
 	failsafe)
+		status_led_off
+		[ -n "$running" ] && {
+			status_led="$running"
+			status_led_off
+		}
+		status_led="$failsafe"
 		status_led_blink_failsafe
 		;;
 	preinit_regular)
 		status_led_blink_preinit_regular
 		;;
+	upgrade)
+		[ -n "$running" ] && {
+			status_led="$upgrade"
+			status_led_blink_preinit_regular
+		}
+		;;
 	done)
-		status_led_on
+		status_led_off
+		[ -n "$running" ] && {
+			status_led="$running"
+			status_led_on
+		}
 		;;
 	esac
 }
diff --git a/target/linux/ipq806x/base-files/lib/ipq806x.sh b/target/linux/ipq806x/base-files/lib/ipq806x.sh
index 0b11b721a751d4ef431cedcd93264168974181f6..ea45381d91c2fbedab833b76e4597ade7200dbea 100644
--- a/target/linux/ipq806x/base-files/lib/ipq806x.sh
+++ b/target/linux/ipq806x/base-files/lib/ipq806x.sh
@@ -59,3 +59,15 @@ ipq806x_board_name() {
 
 	echo "$name"
 }
+
+ipq806x_get_dt_led() {
+	local label
+	local ledpath
+	local basepath="/sys/firmware/devicetree/base"
+	local nodepath="$basepath/aliases/led-$1"
+
+	[ -f "$nodepath" ] && ledpath=$(cat "$nodepath")
+	[ -n "$ledpath" ] && label=$(cat "$basepath$ledpath/label")
+
+	echo "$label"
+}
diff --git a/target/linux/ipq806x/base-files/lib/upgrade/platform.sh b/target/linux/ipq806x/base-files/lib/upgrade/platform.sh
index 7726abb91fb4a3dbb4cc94d9c3d346e35f03b9dd..87689306531accb13114e742db873bfdc5de93c2 100644
--- a/target/linux/ipq806x/base-files/lib/upgrade/platform.sh
+++ b/target/linux/ipq806x/base-files/lib/upgrade/platform.sh
@@ -59,3 +59,9 @@ platform_do_upgrade() {
 		;;
 	esac
 }
+
+blink_led() {
+	. /etc/diag.sh; set_state upgrade
+}
+
+append sysupgrade_pre_upgrade blink_led
diff --git a/target/linux/ipq806x/files/arch/arm/boot/dts/qcom-ipq8064-c2600.dts b/target/linux/ipq806x/files/arch/arm/boot/dts/qcom-ipq8064-c2600.dts
index 96c5c5d94e89959a5b026a495de3e0e77f39b4b6..c0a8a442ab73a3b585d45de8be296fcc060908c6 100644
--- a/target/linux/ipq806x/files/arch/arm/boot/dts/qcom-ipq8064-c2600.dts
+++ b/target/linux/ipq806x/files/arch/arm/boot/dts/qcom-ipq8064-c2600.dts
@@ -23,6 +23,11 @@
 	aliases {
 		serial0 = &uart4;
 		mdio-gpio0 = &mdio0;
+
+		led-boot = &power;
+		led-failsafe = &ledgnr;
+		led-running = &power;
+		led-upgrade = &ledgnr;
 	};
 
 	chosen {
@@ -395,12 +400,12 @@
 			label = "c2600:blue:wan";
 			gpios = <&qcom_pinmux 33 1>;
 		};
-		status {
+		power: status {
 			label = "c2600:blue:status";
 			gpios = <&qcom_pinmux 53 0>;
 			default-state = "on";
 		};
-		ledgnr {
+		ledgnr: ledgnr {
 			label = "c2600:blue:ledgnr";
 			gpios = <&qcom_pinmux 66 0>;
 		};
diff --git a/target/linux/ipq806x/files/arch/arm/boot/dts/qcom-ipq8064-ea8500.dts b/target/linux/ipq806x/files/arch/arm/boot/dts/qcom-ipq8064-ea8500.dts
index 1bcbc9f80e8f719837a2fd405ebc6cccd1e3eeef..96e4acf1a8e51a8f8912341ec0bf795b8d279304 100644
--- a/target/linux/ipq806x/files/arch/arm/boot/dts/qcom-ipq8064-ea8500.dts
+++ b/target/linux/ipq806x/files/arch/arm/boot/dts/qcom-ipq8064-ea8500.dts
@@ -24,6 +24,11 @@
 	aliases {
 		serial0 = &uart4;
 		mdio-gpio0 = &mdio0;
+
+		led-boot = &power;
+		led-failsafe = &power;
+		led-running = &power;
+		led-upgrade = &power;
 	};
 
 	chosen {
@@ -365,7 +370,7 @@
 			default-state = "off";
 		};
 
-		power {
+		power: power {
 			label = "ea8500:white:power";
 			gpios = <&qcom_pinmux 6 1>;
 			default-state = "off";