diff --git a/target/linux/bcm53xx/Makefile b/target/linux/bcm53xx/Makefile
index 84f08f1f80..6bf8ebbd18 100644
--- a/target/linux/bcm53xx/Makefile
+++ b/target/linux/bcm53xx/Makefile
@@ -7,17 +7,13 @@ include $(TOPDIR)/rules.mk
 ARCH:=arm
 BOARD:=bcm53xx
 BOARDNAME:=Broadcom BCM47xx/53xx (ARM)
-FEATURES:=squashfs nand usb pci pcie gpio pwm
+FEATURES:=squashfs usb pci pcie gpio pwm
 CPU_TYPE:=cortex-a9
-SUBTARGETS:=generic
+SUBTARGETS:=generic nand
 
 KERNEL_PATCHVER:=5.15
 KERNEL_TESTING_PATCHVER:=6.1
 
-define Target/Description
-	Build firmware images for Broadcom based BCM47xx/53xx routers with ARM CPU, *not* MIPS.
-endef
-
 include $(INCLUDE_DIR)/target.mk
 
 KERNELNAME:=zImage dtbs
diff --git a/target/linux/bcm53xx/generic/target.mk b/target/linux/bcm53xx/generic/target.mk
index f5cb1fb19b..2b55583077 100644
--- a/target/linux/bcm53xx/generic/target.mk
+++ b/target/linux/bcm53xx/generic/target.mk
@@ -1 +1,5 @@
 BOARDNAME:=Generic
+
+define Target/Description
+	Build firmware images for Broadcom based BCM47xx/53xx routers with ARM CPU, *not* MIPS.
+endef
diff --git a/target/linux/bcm53xx/image/Makefile b/target/linux/bcm53xx/image/Makefile
index 5158b432b3..4af12d0222 100644
--- a/target/linux/bcm53xx/image/Makefile
+++ b/target/linux/bcm53xx/image/Makefile
@@ -105,22 +105,6 @@ define Build/seama-nand
 		-i $@.entity
 endef
 
-define Build/dwl8610ap-image
-	mkdir -p $@.tmptar
-	# The DWL8610AP pretends to be a Broadcom reference design
-	echo "bcm953012er" > $@.tmptar/board
-	echo "LVL7" > $@.tmptar/model
-	# Something high beyond what D-Link has put out
-	echo "5.0.0.0" > $@.tmptar/version
-	# Create rootfs.bin, this is just a NAND image including everything
-	cp $@ $@.tmptar/rootfs.bin
-	# Hash the rootfs.bin
-	cat $@.tmptar/rootfs.bin | md5sum > $@.tmptar/rootfs.md5
-	cd $@.tmptar && tar -c -f $@.new *
-	rm -rf $@.tmptar
-	mv $@.new $@
-endef
-
 DEVICE_VARS += ASUS_PRODUCTID
 DEVICE_VARS += BUFFALO_TAG_PLATFORM BUFFALO_TAG_VERSION BUFFALO_TAG_MINOR
 DEVICE_VARS += SIGNATURE
@@ -159,54 +143,6 @@ define Device/asus
   IMAGE/trx := append-ubi | trx-nand | asus-trx
 endef
 
-define Device/asus_rt-ac3100
-  $(call Device/asus)
-  DEVICE_MODEL := RT-AC3100
-  DEVICE_PACKAGES := $(BRCMFMAC_4366B1) $(BRCMFMAC_4366C0) $(USB3_PACKAGES)
-  ASUS_PRODUCTID := RT-AC3100
-endef
-TARGET_DEVICES += asus_rt-ac3100
-
-define Device/asus_rt-ac56u
-  $(call Device/asus)
-  DEVICE_MODEL := RT-AC56U
-  DEVICE_PACKAGES := $(B43) $(USB3_PACKAGES)
-  ASUS_PRODUCTID := RT-AC56U
-endef
-TARGET_DEVICES += asus_rt-ac56u
-
-define Device/asus_rt-ac68u
-  $(call Device/asus)
-  DEVICE_MODEL := RT-AC68U
-  DEVICE_PACKAGES := $(USB3_PACKAGES)
-  ASUS_PRODUCTID := RT-AC68U
-endef
-TARGET_DEVICES += asus_rt-ac68u
-
-define Device/asus_rt-ac87u
-  $(call Device/asus)
-  DEVICE_MODEL := RT-AC87U
-  DEVICE_PACKAGES := $(USB3_PACKAGES)
-  ASUS_PRODUCTID := RT-AC87U
-endef
-TARGET_DEVICES += asus_rt-ac87u
-
-define Device/asus_rt-ac88u
-  $(call Device/asus)
-  DEVICE_MODEL := RT-AC88U
-  DEVICE_PACKAGES := $(BRCMFMAC_4366B1) $(BRCMFMAC_4366C0) $(USB3_PACKAGES)
-  ASUS_PRODUCTID := RT-AC88U
-endef
-TARGET_DEVICES += asus_rt-ac88u
-
-define Device/asus_rt-n18u
-  $(call Device/asus)
-  DEVICE_MODEL := RT-N18U
-  DEVICE_PACKAGES := $(USB3_PACKAGES)
-  ASUS_PRODUCTID := RT-N18U
-endef
-TARGET_DEVICES += asus_rt-n18u
-
 # Buffalo devices have TFTP recovery mode which can work nicely with initramfs
 # kernels.
 # We should have two initramfs images for Buffalo: plain initramfs kernel and
@@ -218,186 +154,18 @@ define Device/buffalo/Default
   KERNEL_INITRAMFS = $$(KERNEL)
 endef
 
-define Device/buffalo_wxr-1900dhp
-  $(call Device/buffalo/Default)
-  DEVICE_MODEL := WXR-1900DHP
-  DEVICE_PACKAGES := $(USB3_PACKAGES)
-endef
-TARGET_DEVICES += buffalo_wxr-1900dhp
-
-define Device/buffalo_wzr-600dhp2
-  $(call Device/buffalo/Default)
-  DEVICE_MODEL := WZR-600DHP2
-  DEVICE_PACKAGES := $(B43) $(USB2_PACKAGES)
-endef
-TARGET_DEVICES += buffalo_wzr-600dhp2
-
-define Device/buffalo_wzr-900dhp
-  $(call Device/buffalo/Default)
-  DEVICE_MODEL := WZR-900DHP
-  DEVICE_PACKAGES := $(B43) $(USB3_PACKAGES)
-  BUFFALO_TAG_PLATFORM := bcm
-  BUFFALO_TAG_VERSION := 9.99
-  BUFFALO_TAG_MINOR := 9.99
-  IMAGES += factory-DHP-EU.bin factory-DHP2-JP.bin
-  IMAGE/factory-DHP-EU.bin := \
-	append-ubi | trx-nand | buffalo-wzr-header WZR-900DHP EU | \
-	buffalo-enc WZR-900DHP $$(BUFFALO_TAG_VERSION) | \
-	buffalo-tag-dhp WZR-900DHP EU mlang20 | buffalo-enc-tag | \
-	buffalo-dhp-image
-  IMAGE/factory-DHP2-JP.bin := \
-	append-ubi | trx-nand | buffalo-wzr-header WZR-900DHP2 JP | \
-	buffalo-enc WZR-900DHP2 $$(BUFFALO_TAG_VERSION) | \
-	buffalo-tag-dhp WZR-900DHP2 JP jp | buffalo-enc-tag | \
-	buffalo-dhp-image
-endef
-TARGET_DEVICES += buffalo_wzr-900dhp
-
-define Device/buffalo_wzr-1750dhp
-  $(call Device/buffalo/Default)
-  DEVICE_MODEL := WZR-1750DHP
-  DEVICE_PACKAGES := $(B43) $(USB3_PACKAGES)
-endef
-TARGET_DEVICES += buffalo_wzr-1750dhp
-
 define Device/dlink
   DEVICE_VENDOR := D-Link
   IMAGES := bin
   IMAGE/bin := append-ubi | seama-nand
 endef
 
-define Device/dlink_dir-885l
-  DEVICE_MODEL := DIR-885L
-  DEVICE_PACKAGES := $(BRCMFMAC_4366B1) $(USB3_PACKAGES)
-  $(Device/dlink)
-  SIGNATURE := wrgac42_dlink.2015_dir885l
-endef
-TARGET_DEVICES += dlink_dir-885l
-
-define Device/dlink_dwl-8610ap
-  DEVICE_VENDOR := D-Link
-  DEVICE_MODEL := DWL-8610AP
-  DEVICE_PACKAGES := $(B43)
-  IMAGES := factory.tar
-  IMAGE/factory.tar := append-ubi | trx-nand | dwl8610ap-image
-endef
-TARGET_DEVICES += dlink_dwl-8610ap
-
-define Device/linksys_ea6300-v1
-  DEVICE_VENDOR := Linksys
-  DEVICE_MODEL := EA6300
-  DEVICE_VARIANT := v1
-  DEVICE_PACKAGES := $(B43) $(USB3_PACKAGES)
-endef
-TARGET_DEVICES += linksys_ea6300-v1
-
-define Device/linksys_ea6500-v2
-  DEVICE_VENDOR := Linksys
-  DEVICE_MODEL := EA6500
-  DEVICE_VARIANT := v2
-  DEVICE_PACKAGES := $(B43) $(USB3_PACKAGES)
-endef
-TARGET_DEVICES += linksys_ea6500-v2
-
-define Device/linksys_ea9200
-  DEVICE_VENDOR := Linksys
-  DEVICE_MODEL := EA9200
-  DEVICE_VARIANT := v1
-  DEVICE_PACKAGES := $(BRCMFMAC_43602A1) $(USB3_PACKAGES)
-endef
-TARGET_DEVICES += linksys_ea9200
-
-define Device/linksys_ea9500
-  DEVICE_VENDOR := Linksys
-  DEVICE_MODEL := EA9500
-  DEVICE_PACKAGES := $(BRCMFMAC_4366C0) $(USB3_PACKAGES)
-  DEVICE_DTS := bcm47094-linksys-panamera
-endef
-TARGET_DEVICES += linksys_ea9500
-
 define Device/luxul
   DEVICE_VENDOR := Luxul
   IMAGES := lxl
   IMAGE/lxl := append-ubi | trx-nand | luxul-lxl
 endef
 
-define Device/luxul_abr-4500
-  $(Device/luxul)
-  DEVICE_MODEL := ABR-4500
-  DEVICE_PACKAGES := $(USB3_PACKAGES)
-  LUXUL_BOARD := ABR-4500
-endef
-TARGET_DEVICES += luxul_abr-4500
-
-define Device/luxul_xap-1610
-  $(Device/luxul)
-  DEVICE_MODEL := XAP-1610
-  DEVICE_PACKAGES := $(BRCMFMAC_4366C0)
-  IMAGE/lxl := append-rootfs | trx-serial | luxul-lxl
-  LUXUL_BOARD := XAP-1610
-endef
-TARGET_DEVICES += luxul_xap-1610
-
-define Device/luxul_xbr-4500
-  $(Device/luxul)
-  DEVICE_MODEL := XBR-4500
-  DEVICE_PACKAGES := $(USB3_PACKAGES)
-  LUXUL_BOARD := XBR-4500
-endef
-TARGET_DEVICES += luxul_xbr-4500
-
-define Device/luxul_xwr-3150
-  $(Device/luxul)
-  DEVICE_MODEL := XWR-3150
-  DEVICE_PACKAGES := $(BRCMFMAC_4366C0) $(USB3_PACKAGES)
-  DEVICE_DTS := bcm47094-luxul-xwr-3150-v1
-  LUXUL_BOARD := XWR-3150
-endef
-TARGET_DEVICES += luxul_xwr-3150
-
-define Device/meraki_mr26
-  DEVICE_VENDOR := Meraki
-  DEVICE_MODEL := MR26
-  DEVICE_PACKAGES := $(B43) kmod-i2c-bcm-iproc kmod-eeprom-at24 \
-	kmod-hwmon-ina2xx kmod-leds-uleds nu801
-  DEVICE_DTS := bcm53015-meraki-mr26
-# resize the initramfs to fit the size of the existing part.safe.
-  KERNEL_LOADADDR := 0x00008000
-  KERNEL_INITRAMFS_SUFFIX := .bin
-  KERNEL_INITRAMFS := kernel-bin | append-dtb | gzip | uImage gzip | pad-to 9310208
-# LZMA is not supported by the uboot
-  KERNEL := kernel-bin | append-dtb | gzip | uImage gzip
-  IMAGES += sysupgrade.bin
-  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
-endef
-TARGET_DEVICES += meraki_mr26
-
-define Device/meraki_mr32
-  DEVICE_VENDOR := Meraki
-  DEVICE_MODEL := MR32
-  DEVICE_PACKAGES := $(B43) kmod-i2c-bcm-iproc kmod-eeprom-at24 \
-	kmod-leds-pwm kmod-hwmon-ina2xx kmod-bluetooth
-  DEVICE_DTS := bcm53016-meraki-mr32
-# Meraki FW r23 tries to resize the part.safe partition before it will
-# flash the image. This is a bit of a problem, since resizing will fail
-# if the partition is smaller than the old one.
-  KERNEL_LOADADDR := 0x00008000
-  KERNEL_INITRAMFS_SUFFIX := .bin
-  DEVICE_DTS_DELIMITER := @
-  DEVICE_DTS_CONFIG := config@1
-  KERNEL_INITRAMFS := kernel-bin | fit none $$(DTS_DIR)/$$(DEVICE_DTS).dtb | \
-	pad-to 10362880
-  KERNEL := kernel-bin | fit none $$(DTS_DIR)/$$(DEVICE_DTS).dtb
-  IMAGES += sysupgrade.bin
-  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
-
-# The loader is specifically looking for fdt@2:
-# [    3.190000] find_itb_subimage: error finding fdt@2: FDT_ERR_NOTFOUND
-# The image won't boot, if it isn't found. :(
-  DEVICE_FDT_NUM := 2
-endef
-TARGET_DEVICES += meraki_mr32
-
 define Device/netgear
   DEVICE_VENDOR := NETGEAR
   IMAGES := chk
@@ -405,110 +173,6 @@ define Device/netgear
   NETGEAR_REGION := 1
 endef
 
-define Device/netgear_r6250
-  DEVICE_MODEL := R6250
-  DEVICE_PACKAGES := $(B43) $(USB3_PACKAGES)
-  $(Device/netgear)
-  NETGEAR_BOARD_ID := U12H245T00_NETGEAR
-endef
-TARGET_DEVICES += netgear_r6250
-
-define Device/netgear_r6300-v2
-  DEVICE_MODEL := R6300
-  DEVICE_VARIANT := v2
-  DEVICE_PACKAGES := $(B43) $(USB3_PACKAGES)
-  $(Device/netgear)
-  NETGEAR_BOARD_ID := U12H240T00_NETGEAR
-endef
-TARGET_DEVICES += netgear_r6300-v2
-
-define Device/netgear_r7000
-  DEVICE_MODEL := R7000
-  DEVICE_PACKAGES := $(USB3_PACKAGES)
-  $(Device/netgear)
-  NETGEAR_BOARD_ID := U12H270T00_NETGEAR
-endef
-TARGET_DEVICES += netgear_r7000
-
-define Device/netgear_r7900
-  DEVICE_MODEL := R7900
-  DEVICE_PACKAGES := $(BRCMFMAC_43602A1) $(USB3_PACKAGES)
-  $(Device/netgear)
-  NETGEAR_BOARD_ID := U12H315T30_NETGEAR
-endef
-TARGET_DEVICES += netgear_r7900
-
-define Device/netgear_r8000
-  DEVICE_MODEL := R8000
-  DEVICE_PACKAGES := $(BRCMFMAC_43602A1) $(USB3_PACKAGES)
-  $(Device/netgear)
-  NETGEAR_BOARD_ID := U12H315T00_NETGEAR
-endef
-TARGET_DEVICES += netgear_r8000
-
-define Device/netgear_r8500
-  DEVICE_MODEL := R8500
-  DEVICE_PACKAGES := $(BRCMFMAC_4366B1) $(USB3_PACKAGES)
-  $(Device/netgear)
-  NETGEAR_BOARD_ID := U12H334T00_NETGEAR
-  DEFAULT := n
-endef
-TARGET_DEVICES += netgear_r8500
-
-define Device/smartrg_sr400ac
-  DEVICE_VENDOR := SmartRG
-  DEVICE_MODEL := SR400ac
-  DEVICE_PACKAGES := $(BRCMFMAC_43602A1) $(USB3_PACKAGES)
-  IMAGES := trx
-  IMAGE/trx := append-rootfs | trx-serial
-  KERNEL_INITRAMFS_SUFFIX := .bin
-  KERNEL_INITRAMFS := kernel-bin | append-dtb | lzma-d16
-endef
-TARGET_DEVICES += smartrg_sr400ac
-
-define Device/phicomm_k3
-  DEVICE_VENDOR := PHICOMM
-  DEVICE_MODEL := K3
-  DEVICE_ALT0_VENDOR := Wavlink
-  DEVICE_ALT0_MODEL := QUANTUM DAX
-  DEVICE_ALT1_VENDOR := Wavlink
-  DEVICE_ALT1_MODEL := WL-WN538A8
-  DEVICE_PACKAGES := $(BRCMFMAC_4366C0) $(USB3_PACKAGES)
-  IMAGES := trx
-endef
-TARGET_DEVICES += phicomm_k3
-
-define Device/tenda_ac9
-  DEVICE_VENDOR := Tenda
-  DEVICE_MODEL := AC9
-  DEVICE_PACKAGES := $(B43) $(USB2_PACKAGES)
-  IMAGES := trx
-  IMAGE/trx := append-rootfs | trx-serial
-endef
-TARGET_DEVICES += tenda_ac9
-
-define Device/tplink_archer-c5-v2
-  DEVICE_VENDOR := TP-Link
-  DEVICE_MODEL := Archer C5
-  DEVICE_VARIANT := v2
-  DEVICE_PACKAGES := $(B43) $(USB2_PACKAGES)
-  IMAGES := bin
-  IMAGE/bin := append-rootfs | bcm53xx-tplink-safeloader
-  TPLINK_BOARD := ARCHER-C5-V2
-  BROKEN := y
-endef
-#TARGET_DEVICES += tplink_archer-c5-v2
-
-define Device/tplink_archer-c9-v1
-  DEVICE_VENDOR := TP-Link
-  DEVICE_MODEL := Archer C9
-  DEVICE_VARIANT := v1
-  DEVICE_PACKAGES := $(USB3_PACKAGES)
-  IMAGES := bin
-  IMAGE/bin := append-rootfs | bcm53xx-tplink-safeloader
-  TPLINK_BOARD := ARCHERC9
-  BROKEN := y
-endef
-#TARGET_DEVICES += tplink_archer-c9-v1
+include $(SUBTARGET).mk
 
 $(eval $(call BuildImage))
diff --git a/target/linux/bcm53xx/image/generic.mk b/target/linux/bcm53xx/image/generic.mk
new file mode 100644
index 0000000000..7c66dd2d93
--- /dev/null
+++ b/target/linux/bcm53xx/image/generic.mk
@@ -0,0 +1,43 @@
+define Device/smartrg_sr400ac
+  DEVICE_VENDOR := SmartRG
+  DEVICE_MODEL := SR400ac
+  DEVICE_PACKAGES := $(BRCMFMAC_43602A1) $(USB3_PACKAGES)
+  IMAGES := trx
+  IMAGE/trx := append-rootfs | trx-serial
+  KERNEL_INITRAMFS_SUFFIX := .bin
+  KERNEL_INITRAMFS := kernel-bin | append-dtb | lzma-d16
+endef
+TARGET_DEVICES += smartrg_sr400ac
+
+define Device/tenda_ac9
+  DEVICE_VENDOR := Tenda
+  DEVICE_MODEL := AC9
+  DEVICE_PACKAGES := $(B43) $(USB2_PACKAGES)
+  IMAGES := trx
+  IMAGE/trx := append-rootfs | trx-serial
+endef
+TARGET_DEVICES += tenda_ac9
+
+define Device/tplink_archer-c5-v2
+  DEVICE_VENDOR := TP-Link
+  DEVICE_MODEL := Archer C5
+  DEVICE_VARIANT := v2
+  DEVICE_PACKAGES := $(B43) $(USB2_PACKAGES)
+  IMAGES := bin
+  IMAGE/bin := append-rootfs | bcm53xx-tplink-safeloader
+  TPLINK_BOARD := ARCHER-C5-V2
+  BROKEN := y
+endef
+#TARGET_DEVICES += tplink_archer-c5-v2
+
+define Device/tplink_archer-c9-v1
+  DEVICE_VENDOR := TP-Link
+  DEVICE_MODEL := Archer C9
+  DEVICE_VARIANT := v1
+  DEVICE_PACKAGES := $(USB3_PACKAGES)
+  IMAGES := bin
+  IMAGE/bin := append-rootfs | bcm53xx-tplink-safeloader
+  TPLINK_BOARD := ARCHERC9
+  BROKEN := y
+endef
+#TARGET_DEVICES += tplink_archer-c9-v1
diff --git a/target/linux/bcm53xx/image/nand.mk b/target/linux/bcm53xx/image/nand.mk
new file mode 100644
index 0000000000..813c34470b
--- /dev/null
+++ b/target/linux/bcm53xx/image/nand.mk
@@ -0,0 +1,293 @@
+define Build/dwl8610ap-image
+	mkdir -p $@.tmptar
+	# The DWL8610AP pretends to be a Broadcom reference design
+	echo "bcm953012er" > $@.tmptar/board
+	echo "LVL7" > $@.tmptar/model
+	# Something high beyond what D-Link has put out
+	echo "5.0.0.0" > $@.tmptar/version
+	# Create rootfs.bin, this is just a NAND image including everything
+	cp $@ $@.tmptar/rootfs.bin
+	# Hash the rootfs.bin
+	cat $@.tmptar/rootfs.bin | md5sum > $@.tmptar/rootfs.md5
+	cd $@.tmptar && tar -c -f $@.new *
+	rm -rf $@.tmptar
+	mv $@.new $@
+endef
+
+define Device/asus_rt-ac3100
+  $(call Device/asus)
+  DEVICE_MODEL := RT-AC3100
+  DEVICE_PACKAGES := $(BRCMFMAC_4366B1) $(BRCMFMAC_4366C0) $(USB3_PACKAGES)
+  ASUS_PRODUCTID := RT-AC3100
+endef
+TARGET_DEVICES += asus_rt-ac3100
+
+define Device/asus_rt-ac56u
+  $(call Device/asus)
+  DEVICE_MODEL := RT-AC56U
+  DEVICE_PACKAGES := $(B43) $(USB3_PACKAGES)
+  ASUS_PRODUCTID := RT-AC56U
+endef
+TARGET_DEVICES += asus_rt-ac56u
+
+define Device/asus_rt-ac68u
+  $(call Device/asus)
+  DEVICE_MODEL := RT-AC68U
+  DEVICE_PACKAGES := $(USB3_PACKAGES)
+  ASUS_PRODUCTID := RT-AC68U
+endef
+TARGET_DEVICES += asus_rt-ac68u
+
+define Device/asus_rt-ac87u
+  $(call Device/asus)
+  DEVICE_MODEL := RT-AC87U
+  DEVICE_PACKAGES := $(USB3_PACKAGES)
+  ASUS_PRODUCTID := RT-AC87U
+endef
+TARGET_DEVICES += asus_rt-ac87u
+
+define Device/asus_rt-ac88u
+  $(call Device/asus)
+  DEVICE_MODEL := RT-AC88U
+  DEVICE_PACKAGES := $(BRCMFMAC_4366B1) $(BRCMFMAC_4366C0) $(USB3_PACKAGES)
+  ASUS_PRODUCTID := RT-AC88U
+endef
+TARGET_DEVICES += asus_rt-ac88u
+
+define Device/asus_rt-n18u
+  $(call Device/asus)
+  DEVICE_MODEL := RT-N18U
+  DEVICE_PACKAGES := $(USB3_PACKAGES)
+  ASUS_PRODUCTID := RT-N18U
+endef
+TARGET_DEVICES += asus_rt-n18u
+
+define Device/buffalo_wxr-1900dhp
+  $(call Device/buffalo/Default)
+  DEVICE_MODEL := WXR-1900DHP
+  DEVICE_PACKAGES := $(USB3_PACKAGES)
+endef
+TARGET_DEVICES += buffalo_wxr-1900dhp
+
+define Device/buffalo_wzr-600dhp2
+  $(call Device/buffalo/Default)
+  DEVICE_MODEL := WZR-600DHP2
+  DEVICE_PACKAGES := $(B43) $(USB2_PACKAGES)
+endef
+TARGET_DEVICES += buffalo_wzr-600dhp2
+
+define Device/buffalo_wzr-900dhp
+  $(call Device/buffalo/Default)
+  DEVICE_MODEL := WZR-900DHP
+  DEVICE_PACKAGES := $(B43) $(USB3_PACKAGES)
+  BUFFALO_TAG_PLATFORM := bcm
+  BUFFALO_TAG_VERSION := 9.99
+  BUFFALO_TAG_MINOR := 9.99
+  IMAGES += factory-DHP-EU.bin factory-DHP2-JP.bin
+  IMAGE/factory-DHP-EU.bin := \
+	append-ubi | trx-nand | buffalo-wzr-header WZR-900DHP EU | \
+	buffalo-enc WZR-900DHP $$(BUFFALO_TAG_VERSION) | \
+	buffalo-tag-dhp WZR-900DHP EU mlang20 | buffalo-enc-tag | \
+	buffalo-dhp-image
+  IMAGE/factory-DHP2-JP.bin := \
+	append-ubi | trx-nand | buffalo-wzr-header WZR-900DHP2 JP | \
+	buffalo-enc WZR-900DHP2 $$(BUFFALO_TAG_VERSION) | \
+	buffalo-tag-dhp WZR-900DHP2 JP jp | buffalo-enc-tag | \
+	buffalo-dhp-image
+endef
+TARGET_DEVICES += buffalo_wzr-900dhp
+
+define Device/buffalo_wzr-1750dhp
+  $(call Device/buffalo/Default)
+  DEVICE_MODEL := WZR-1750DHP
+  DEVICE_PACKAGES := $(B43) $(USB3_PACKAGES)
+endef
+TARGET_DEVICES += buffalo_wzr-1750dhp
+
+define Device/dlink_dir-885l
+  DEVICE_MODEL := DIR-885L
+  DEVICE_PACKAGES := $(BRCMFMAC_4366B1) $(USB3_PACKAGES)
+  $(Device/dlink)
+  SIGNATURE := wrgac42_dlink.2015_dir885l
+endef
+TARGET_DEVICES += dlink_dir-885l
+
+define Device/dlink_dwl-8610ap
+  DEVICE_VENDOR := D-Link
+  DEVICE_MODEL := DWL-8610AP
+  DEVICE_PACKAGES := $(B43)
+  IMAGES := factory.tar
+  IMAGE/factory.tar := append-ubi | trx-nand | dwl8610ap-image
+endef
+TARGET_DEVICES += dlink_dwl-8610ap
+
+define Device/linksys_ea6300-v1
+  DEVICE_VENDOR := Linksys
+  DEVICE_MODEL := EA6300
+  DEVICE_VARIANT := v1
+  DEVICE_PACKAGES := $(B43) $(USB3_PACKAGES)
+endef
+TARGET_DEVICES += linksys_ea6300-v1
+
+define Device/linksys_ea6500-v2
+  DEVICE_VENDOR := Linksys
+  DEVICE_MODEL := EA6500
+  DEVICE_VARIANT := v2
+  DEVICE_PACKAGES := $(B43) $(USB3_PACKAGES)
+endef
+TARGET_DEVICES += linksys_ea6500-v2
+
+define Device/linksys_ea9200
+  DEVICE_VENDOR := Linksys
+  DEVICE_MODEL := EA9200
+  DEVICE_VARIANT := v1
+  DEVICE_PACKAGES := $(BRCMFMAC_43602A1) $(USB3_PACKAGES)
+endef
+TARGET_DEVICES += linksys_ea9200
+
+define Device/linksys_ea9500
+  DEVICE_VENDOR := Linksys
+  DEVICE_MODEL := EA9500
+  DEVICE_PACKAGES := $(BRCMFMAC_4366C0) $(USB3_PACKAGES)
+  DEVICE_DTS := bcm47094-linksys-panamera
+endef
+TARGET_DEVICES += linksys_ea9500
+
+define Device/luxul_abr-4500
+  $(Device/luxul)
+  DEVICE_MODEL := ABR-4500
+  DEVICE_PACKAGES := $(USB3_PACKAGES)
+  LUXUL_BOARD := ABR-4500
+endef
+TARGET_DEVICES += luxul_abr-4500
+
+define Device/luxul_xap-1610
+  $(Device/luxul)
+  DEVICE_MODEL := XAP-1610
+  DEVICE_PACKAGES := $(BRCMFMAC_4366C0)
+  IMAGE/lxl := append-rootfs | trx-serial | luxul-lxl
+  LUXUL_BOARD := XAP-1610
+endef
+TARGET_DEVICES += luxul_xap-1610
+
+define Device/luxul_xbr-4500
+  $(Device/luxul)
+  DEVICE_MODEL := XBR-4500
+  DEVICE_PACKAGES := $(USB3_PACKAGES)
+  LUXUL_BOARD := XBR-4500
+endef
+TARGET_DEVICES += luxul_xbr-4500
+
+define Device/luxul_xwr-3150
+  $(Device/luxul)
+  DEVICE_MODEL := XWR-3150
+  DEVICE_PACKAGES := $(BRCMFMAC_4366C0) $(USB3_PACKAGES)
+  DEVICE_DTS := bcm47094-luxul-xwr-3150-v1
+  LUXUL_BOARD := XWR-3150
+endef
+TARGET_DEVICES += luxul_xwr-3150
+
+define Device/meraki_mr26
+  DEVICE_VENDOR := Meraki
+  DEVICE_MODEL := MR26
+  DEVICE_PACKAGES := $(B43) kmod-i2c-bcm-iproc kmod-eeprom-at24 \
+	kmod-hwmon-ina2xx kmod-leds-uleds nu801
+  DEVICE_DTS := bcm53015-meraki-mr26
+# resize the initramfs to fit the size of the existing part.safe.
+  KERNEL_LOADADDR := 0x00008000
+  KERNEL_INITRAMFS_SUFFIX := .bin
+  KERNEL_INITRAMFS := kernel-bin | append-dtb | gzip | uImage gzip | pad-to 9310208
+# LZMA is not supported by the uboot
+  KERNEL := kernel-bin | append-dtb | gzip | uImage gzip
+  IMAGES += sysupgrade.bin
+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
+endef
+TARGET_DEVICES += meraki_mr26
+
+define Device/meraki_mr32
+  DEVICE_VENDOR := Meraki
+  DEVICE_MODEL := MR32
+  DEVICE_PACKAGES := $(B43) kmod-i2c-bcm-iproc kmod-eeprom-at24 \
+	kmod-leds-pwm kmod-hwmon-ina2xx kmod-bluetooth
+  DEVICE_DTS := bcm53016-meraki-mr32
+# Meraki FW r23 tries to resize the part.safe partition before it will
+# flash the image. This is a bit of a problem, since resizing will fail
+# if the partition is smaller than the old one.
+  KERNEL_LOADADDR := 0x00008000
+  KERNEL_INITRAMFS_SUFFIX := .bin
+  DEVICE_DTS_DELIMITER := @
+  DEVICE_DTS_CONFIG := config@1
+  KERNEL_INITRAMFS := kernel-bin | fit none $$(DTS_DIR)/$$(DEVICE_DTS).dtb | \
+	pad-to 10362880
+  KERNEL := kernel-bin | fit none $$(DTS_DIR)/$$(DEVICE_DTS).dtb
+  IMAGES += sysupgrade.bin
+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
+
+# The loader is specifically looking for fdt@2:
+# [    3.190000] find_itb_subimage: error finding fdt@2: FDT_ERR_NOTFOUND
+# The image won't boot, if it isn't found. :(
+  DEVICE_FDT_NUM := 2
+endef
+TARGET_DEVICES += meraki_mr32
+
+define Device/netgear_r6250
+  DEVICE_MODEL := R6250
+  DEVICE_PACKAGES := $(B43) $(USB3_PACKAGES)
+  $(Device/netgear)
+  NETGEAR_BOARD_ID := U12H245T00_NETGEAR
+endef
+TARGET_DEVICES += netgear_r6250
+
+define Device/netgear_r6300-v2
+  DEVICE_MODEL := R6300
+  DEVICE_VARIANT := v2
+  DEVICE_PACKAGES := $(B43) $(USB3_PACKAGES)
+  $(Device/netgear)
+  NETGEAR_BOARD_ID := U12H240T00_NETGEAR
+endef
+TARGET_DEVICES += netgear_r6300-v2
+
+define Device/netgear_r7000
+  DEVICE_MODEL := R7000
+  DEVICE_PACKAGES := $(USB3_PACKAGES)
+  $(Device/netgear)
+  NETGEAR_BOARD_ID := U12H270T00_NETGEAR
+endef
+TARGET_DEVICES += netgear_r7000
+
+define Device/netgear_r7900
+  DEVICE_MODEL := R7900
+  DEVICE_PACKAGES := $(BRCMFMAC_43602A1) $(USB3_PACKAGES)
+  $(Device/netgear)
+  NETGEAR_BOARD_ID := U12H315T30_NETGEAR
+endef
+TARGET_DEVICES += netgear_r7900
+
+define Device/netgear_r8000
+  DEVICE_MODEL := R8000
+  DEVICE_PACKAGES := $(BRCMFMAC_43602A1) $(USB3_PACKAGES)
+  $(Device/netgear)
+  NETGEAR_BOARD_ID := U12H315T00_NETGEAR
+endef
+TARGET_DEVICES += netgear_r8000
+
+define Device/netgear_r8500
+  DEVICE_MODEL := R8500
+  DEVICE_PACKAGES := $(BRCMFMAC_4366B1) $(USB3_PACKAGES)
+  $(Device/netgear)
+  NETGEAR_BOARD_ID := U12H334T00_NETGEAR
+  DEFAULT := n
+endef
+TARGET_DEVICES += netgear_r8500
+
+define Device/phicomm_k3
+  DEVICE_VENDOR := PHICOMM
+  DEVICE_MODEL := K3
+  DEVICE_ALT0_VENDOR := Wavlink
+  DEVICE_ALT0_MODEL := QUANTUM DAX
+  DEVICE_ALT1_VENDOR := Wavlink
+  DEVICE_ALT1_MODEL := WL-WN538A8
+  DEVICE_PACKAGES := $(BRCMFMAC_4366C0) $(USB3_PACKAGES)
+  IMAGES := trx
+endef
+TARGET_DEVICES += phicomm_k3
diff --git a/target/linux/bcm53xx/nand/config-default b/target/linux/bcm53xx/nand/config-default
new file mode 100644
index 0000000000..d6ea56ade2
--- /dev/null
+++ b/target/linux/bcm53xx/nand/config-default
@@ -0,0 +1,3 @@
+CONFIG_NVMEM=n
+CONFIG_NVMEM_BRCM_NVRAM=n
+CONFIG_NVMEM_SYSFS=n
diff --git a/target/linux/bcm53xx/nand/target.mk b/target/linux/bcm53xx/nand/target.mk
new file mode 100644
index 0000000000..c81b3c6cc6
--- /dev/null
+++ b/target/linux/bcm53xx/nand/target.mk
@@ -0,0 +1,6 @@
+BOARDNAME:=Generic devices with NAND flash
+FEATURES+=nand
+
+define Target/Description
+	Build firmware images for generic devices with NAND flash.
+endef
