diff --git a/target/linux/ramips/base-files/etc/board.d/01_leds b/target/linux/ramips/base-files/etc/board.d/01_leds
index b2c69d4b59..94ed6d41f6 100755
--- a/target/linux/ramips/base-files/etc/board.d/01_leds
+++ b/target/linux/ramips/base-files/etc/board.d/01_leds
@@ -330,7 +330,8 @@ tplink,c20-v4)
 	ucidef_set_led_switch "wan" "wan" "$boardname:green:wan" "switch0" "0x01"
 	ucidef_set_led_netdev "wlan2g" "wlan2g" "$boardname:green:wlan2g" "wlan0"
 	;;
-tplink,c50-v3)
+tplink,c50-v3|\
+tplink,c50-v4)
 	ucidef_set_led_switch "lan" "lan" "$boardname:green:lan" "switch0" "0x1e"
 	ucidef_set_led_switch "wan" "wan" "$boardname:green:wan" "switch0" "0x01"
 	ucidef_set_led_wlan "wlan2g" "wlan2g" "$boardname:green:wlan2g" "phy0tpt"
diff --git a/target/linux/ramips/base-files/etc/board.d/02_network b/target/linux/ramips/base-files/etc/board.d/02_network
index 3af836a6f3..d52a41880f 100755
--- a/target/linux/ramips/base-files/etc/board.d/02_network
+++ b/target/linux/ramips/base-files/etc/board.d/02_network
@@ -218,6 +218,7 @@ ramips_setup_interfaces()
 	skylab,skw92a|\
 	tplink,c20-v4|\
 	tplink,c50-v3|\
+	tplink,c50-v4|\
 	tplink,tl-mr3420-v5|\
 	tplink,tl-wr842n-v5|\
 	tl-wr840n-v4|\
diff --git a/target/linux/ramips/base-files/lib/upgrade/platform.sh b/target/linux/ramips/base-files/lib/upgrade/platform.sh
index 120cf8322a..d8060b600b 100755
--- a/target/linux/ramips/base-files/lib/upgrade/platform.sh
+++ b/target/linux/ramips/base-files/lib/upgrade/platform.sh
@@ -270,6 +270,7 @@ platform_check_image() {
 	tplink,c20-v1|\
 	tplink,c20-v4|\
 	tplink,c50-v3|\
+	tplink,c50-v4|\
 	tplink,tl-mr3020-v3|\
 	tplink,tl-mr3420-v5|\
 	tplink,tl-wa801nd-v5|\
@@ -370,6 +371,9 @@ platform_do_upgrade() {
 	ubnt-erx-sfp)
 		nand_do_upgrade "$ARGV"
 		;;
+	tplink,c50-v4)
+		platform_upgrade_tpl_recovery "$ARGV"
+		;;
 	*)
 		default_do_upgrade "$ARGV"
 		;;
diff --git a/target/linux/ramips/base-files/lib/upgrade/tplink.sh b/target/linux/ramips/base-files/lib/upgrade/tplink.sh
new file mode 100644
index 0000000000..83f74c2b46
--- /dev/null
+++ b/target/linux/ramips/base-files/lib/upgrade/tplink.sh
@@ -0,0 +1,31 @@
+#
+# Copyright (C) 2018 OpenWrt.org
+#
+. /lib/functions/system.sh
+
+tplink_get_uboot_args_partition() {
+	local board=$(board_name)
+
+	case "$board" in
+	tplink,c50-v4)
+		echo "romfile"
+		;;
+	esac
+}
+
+platform_upgrade_tpl_recovery() {
+	local uboot_args_part=$(tplink_get_uboot_args_partition)
+	local uboot_args_mtd=$(find_mtd_chardev $uboot_args_part)
+
+	dd if=$uboot_args_mtd of=/tmp/romfile && \
+	printf '\xef\xcd\xab\x89' | \
+	dd of=/tmp/romfile bs=1 seek=0 conv=notrunc \
+	&& mtd write /tmp/romfile $uboot_args_part
+
+	default_do_upgrade "$ARGV"
+
+	printf '\x00\x00\x00\x00' | \
+	dd of=/tmp/romfile bs=1 seek=0 conv=notrunc \
+	&& mtd write /tmp/romfile $uboot_args_part \
+	&& rm /tmp/romfile
+}
diff --git a/target/linux/ramips/dts/ArcherC50V4.dts b/target/linux/ramips/dts/ArcherC50V4.dts
new file mode 100644
index 0000000000..25e305825b
--- /dev/null
+++ b/target/linux/ramips/dts/ArcherC50V4.dts
@@ -0,0 +1,100 @@
+/dts-v1/;
+
+#include "TPLINK-8M-SPLIT-UBOOT.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+/ {
+	compatible = "tplink,c50-v4", "mediatek,mt7628an-soc";
+	model = "TP-Link Archer C50 v4";
+
+	aliases {
+		led-boot = &led_power;
+		led-failsafe = &led_power;
+		led-running = &led_power;
+		led-upgrade = &led_power;
+	};
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+
+		reset {
+			label = "reset";
+			gpios = <&gpio1 6 GPIO_ACTIVE_LOW>;
+			linux,code = <KEY_RESTART>;
+		};
+
+		rfkill {
+			label = "rfkill";
+			gpios = <&gpio0 5 GPIO_ACTIVE_LOW>;
+			linux,code = <KEY_RFKILL>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		lan {
+			label = "c50-v4:green:lan";
+			gpios = <&gpio1 9 GPIO_ACTIVE_LOW>;
+		};
+
+		led_power: power {
+			label = "c50-v4:green:power";
+			gpios = <&gpio0 11 GPIO_ACTIVE_LOW>;
+		};
+
+		wan {
+			label = "c50-v4:green:wan";
+			gpios = <&gpio1 7 GPIO_ACTIVE_LOW>;
+		};
+
+		wan_orange {
+			label = "c50-v4:orange:wan";
+			gpios = <&gpio1 8 GPIO_ACTIVE_LOW>;
+		};
+
+		wlan {
+			label = "c50-v4:green:wlan2g";
+			gpios = <&gpio1 12 GPIO_ACTIVE_LOW>;
+		};
+
+		wlan5 {
+			label = "c50-v4:green:wlan5g";
+			gpios = <&gpio1 10 GPIO_ACTIVE_LOW>;
+		};
+
+		wps {
+			label = "c50-v4:green:wps";
+			gpios = <&gpio1 11 GPIO_ACTIVE_LOW>;
+		};
+	};
+};
+
+&pinctrl {
+	state_default: pinctrl0 {
+		gpio {
+			ralink,group = "i2c", "gpio", "p0led_an", "p1led_an", "p2led_an",
+				       "p3led_an", "p4led_an", "wdt", "wled_an";
+			ralink,function = "gpio";
+		};
+	};
+};
+
+&pcie {
+	status = "okay";
+};
+
+&pcie0 {
+	mt76@0,0 {
+		reg = <0x0000 0 0 0 0>;
+		mediatek,mtd-eeprom = <&radio 0x8000>;
+		ieee80211-freq-limit = <5000000 6000000>;
+		mtd-mac-address = <&rom 0xf100>;
+		mtd-mac-address-increment = <(-1)>;
+	};
+};
diff --git a/target/linux/ramips/dts/TPLINK-8M-SPLIT-UBOOT.dtsi b/target/linux/ramips/dts/TPLINK-8M-SPLIT-UBOOT.dtsi
new file mode 100644
index 0000000000..13ad0312cd
--- /dev/null
+++ b/target/linux/ramips/dts/TPLINK-8M-SPLIT-UBOOT.dtsi
@@ -0,0 +1,89 @@
+#include "mt7628an.dtsi"
+
+/ {
+	chosen {
+		bootargs = "console=ttyS0,115200";
+	};
+
+	memory@0 {
+		device_type = "memory";
+		reg = <0x0 0x4000000>;
+	};
+};
+
+&spi0 {
+	status = "okay";
+
+	m25p80@0 {
+		compatible = "jedec,spi-nor";
+		reg = <0>;
+		spi-max-frequency = <10000000>;
+		m25p,chunked-io = <32>;
+
+		partitions {
+			compatible = "fixed-partitions";
+			#address-cells = <1>;
+			#size-cells = <1>;
+
+			partition@0 {
+				label = "factory-uboot";
+				reg = <0x0 0x30000>;
+				read-only;
+			};
+
+			partition@30000 {
+				label = "boot";
+				reg = <0x30000 0x20000>;
+				read-only;
+			};
+
+			partition@50000 {
+				compatible = "tplink,firmware";
+				label = "firmware";
+				reg = <0x50000 0x770000>;
+			};
+
+			partition@7c0000 {
+				label = "config";
+				reg = <0x7c0000 0x10000>;
+				read-only;
+			};
+
+			rom: partition@7d0000 {
+				label = "rom";
+				reg = <0x7d0000 0x10000>;
+				read-only;
+			};
+
+			partition@7e0000 {
+				label = "romfile";
+				reg = <0x7e0000 0x10000>;
+			};
+
+			radio: partition@7f0000 {
+				label = "radio";
+				reg = <0x7f0000 0x10000>;
+				read-only;
+			};
+		};
+	};
+};
+
+&ehci {
+	status = "disabled";
+};
+
+&ohci {
+	status = "disabled";
+};
+
+&wmac {
+	status = "okay";
+	mtd-mac-address = <&rom 0xf100>;
+	mediatek,mtd-eeprom = <&radio 0x0>;
+};
+
+&ethernet {
+	mtd-mac-address = <&rom 0xf100>;
+	mediatek,portmap = "llllw";
+};
diff --git a/target/linux/ramips/image/mt76x8.mk b/target/linux/ramips/image/mt76x8.mk
index d2f402e939..b4019e19f1 100644
--- a/target/linux/ramips/image/mt76x8.mk
+++ b/target/linux/ramips/image/mt76x8.mk
@@ -239,6 +239,20 @@ define Device/tplink_c50-v3
 endef
 TARGET_DEVICES += tplink_c50-v3
 
+define Device/tplink_c50-v4
+  $(Device/tplink)
+  DTS := ArcherC50V4
+  IMAGE_SIZE := 7616k
+  DEVICE_TITLE := TP-Link ArcherC50 v4
+  TPLINK_FLASHLAYOUT := 8MSUmtk
+  TPLINK_HWID := 0x001D589B
+  TPLINK_HWREV := 0x93
+  TPLINK_HWREVADD := 0x2
+  TPLINK_HVERSION := 3
+  IMAGES := sysupgrade.bin
+endef
+TARGET_DEVICES += tplink_c50-v4
+
 define Device/tplink_tl-mr3020-v3
   $(Device/tplink)
   DTS := TL-MR3020V3
