diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh
index 384bf032ca2..b1e1d2312be 100755
--- a/target/linux/ar71xx/base-files/etc/diag.sh
+++ b/target/linux/ar71xx/base-files/etc/diag.sh
@@ -108,6 +108,9 @@ get_status_led() {
 	wzr-hp-g300nh)
 		status_led="wzr-hp-g300nh:green:router"
 		;;
+	zcn-1523h-2 | zcn-1523h-5)
+		status_led="zcn-1523h:amber:init"
+		;;
 	esac;
 }
 
diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/zcn-1523h-2 b/target/linux/ar71xx/base-files/etc/uci-defaults/zcn-1523h-2
new file mode 100755
index 00000000000..4f77316357d
--- /dev/null
+++ b/target/linux/ar71xx/base-files/etc/uci-defaults/zcn-1523h-2
@@ -0,0 +1,24 @@
+#!/bin/sh
+#
+# Copyright (C) 2010 OpenWrt.org
+#
+
+. /lib/ar71xx.sh
+
+board=$(ar71xx_board_name)
+
+zcn_set_leds() {
+	uci batch <<EOF
+set system.led_lan1='led'
+set system.led_lan1.name='lan1'
+set system.led_lan1.sysfs='zcn-1523h:green:lan1'
+set system.led_lan1.trigger='netdev'
+set system.led_lan1.dev='eth0'
+set system.led_lan1.mode='link tx rx'
+commit system
+EOF
+}
+
+if [ "${board}" == "zcn-1523h-2" ]; then
+	zcn_set_leds
+fi
diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/zcn-1523h-5 b/target/linux/ar71xx/base-files/etc/uci-defaults/zcn-1523h-5
new file mode 100755
index 00000000000..c62f72f0999
--- /dev/null
+++ b/target/linux/ar71xx/base-files/etc/uci-defaults/zcn-1523h-5
@@ -0,0 +1,30 @@
+#!/bin/sh
+#
+# Copyright (C) 2010 OpenWrt.org
+#
+
+. /lib/ar71xx.sh
+
+board=$(ar71xx_board_name)
+
+zcn_set_leds() {
+	uci batch <<EOF
+set system.led_lan1='led'
+set system.led_lan1.name='lan1'
+set system.led_lan1.sysfs='zcn-1523h:green:lan1'
+set system.led_lan1.trigger='netdev'
+set system.led_lan1.dev='eth0'
+set system.led_lan1.mode='link tx rx'
+set system.led_lan2='led'
+set system.led_lan2.name='lan2'
+set system.led_lan2.sysfs='zcn-1523h:green:lan2'
+set system.led_lan2.trigger='netdev'
+set system.led_lan2.dev='eth1'
+set system.led_lan2.mode='link tx rx'
+commit system
+EOF
+}
+
+if [ "${board}" == "zcn-1523h-5" ]; then
+	zcn_set_leds
+fi
diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh
index 2a96822628d..4b08e93c188 100755
--- a/target/linux/ar71xx/base-files/lib/ar71xx.sh
+++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh
@@ -121,6 +121,12 @@ ar71xx_board_name() {
 	*WZR-HP-G300NH)
 		name="wzr-hp-g300nh"
 		;;
+	*ZCN-1523H-2)
+		name="zcn-1523h-2"
+		;;
+	*ZCN-1523H-5)
+		name="zcn-1523h-5"
+		;;
 	*)
 		name="generic"
 		;;
diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
index bfa5cc69bd7..29aeff42ef1 100755
--- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
+++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
@@ -96,6 +96,13 @@ platform_check_image() {
 		}
 		return 0
 		;;
+	zcn-1523h-2 | zcn-1523h-5)
+		[ "$magic" != "6873" -a "$magic" != "1985" ] && {
+			echo "Invalid image type."
+			return 1
+		}
+		return 0
+		;;
 	routerstation | routerstation-pro | ls-sr71 | pb42 | pb44 | eap7660d )
 		[ "$magic" != "4349" ] && {
 			echo "Invalid image. Use *-sysupgrade.bin files on this board"
diff --git a/target/linux/ar71xx/config-2.6.32 b/target/linux/ar71xx/config-2.6.32
index 9e4296b9f52..b3ed8917a33 100644
--- a/target/linux/ar71xx/config-2.6.32
+++ b/target/linux/ar71xx/config-2.6.32
@@ -45,6 +45,7 @@ CONFIG_AR71XX_MACH_WP543=y
 CONFIG_AR71XX_MACH_WRT160NL=y
 CONFIG_AR71XX_MACH_WRT400N=y
 CONFIG_AR71XX_MACH_WZR_HP_G300NH=y
+CONFIG_AR71XX_MACH_ZCN_1523H=y
 CONFIG_AR71XX_NVRAM=y
 CONFIG_AR71XX_WDT=y
 CONFIG_AR8216_PHY=y
diff --git a/target/linux/ar71xx/config-2.6.33 b/target/linux/ar71xx/config-2.6.33
index 5bc478c4632..e27fb2a251c 100644
--- a/target/linux/ar71xx/config-2.6.33
+++ b/target/linux/ar71xx/config-2.6.33
@@ -45,6 +45,7 @@ CONFIG_AR71XX_MACH_WP543=y
 CONFIG_AR71XX_MACH_WRT160NL=y
 CONFIG_AR71XX_MACH_WRT400N=y
 CONFIG_AR71XX_MACH_WZR_HP_G300NH=y
+CONFIG_AR71XX_MACH_ZCN_1523H=y
 CONFIG_AR71XX_NVRAM=y
 CONFIG_AR71XX_WDT=y
 CONFIG_AR8216_PHY=y
diff --git a/target/linux/ar71xx/config-2.6.34 b/target/linux/ar71xx/config-2.6.34
index 36a8f330208..6632d501dff 100644
--- a/target/linux/ar71xx/config-2.6.34
+++ b/target/linux/ar71xx/config-2.6.34
@@ -45,6 +45,7 @@ CONFIG_AR71XX_MACH_WP543=y
 CONFIG_AR71XX_MACH_WRT160NL=y
 CONFIG_AR71XX_MACH_WRT400N=y
 CONFIG_AR71XX_MACH_WZR_HP_G300NH=y
+CONFIG_AR71XX_MACH_ZCN_1523H=y
 CONFIG_AR71XX_NVRAM=y
 CONFIG_AR71XX_WDT=y
 CONFIG_AR8216_PHY=y
diff --git a/target/linux/ar71xx/config-2.6.35 b/target/linux/ar71xx/config-2.6.35
index 36a8f330208..6632d501dff 100644
--- a/target/linux/ar71xx/config-2.6.35
+++ b/target/linux/ar71xx/config-2.6.35
@@ -45,6 +45,7 @@ CONFIG_AR71XX_MACH_WP543=y
 CONFIG_AR71XX_MACH_WRT160NL=y
 CONFIG_AR71XX_MACH_WRT400N=y
 CONFIG_AR71XX_MACH_WZR_HP_G300NH=y
+CONFIG_AR71XX_MACH_ZCN_1523H=y
 CONFIG_AR71XX_NVRAM=y
 CONFIG_AR71XX_WDT=y
 CONFIG_AR8216_PHY=y
diff --git a/target/linux/ar71xx/files/arch/mips/ar71xx/Kconfig b/target/linux/ar71xx/files/arch/mips/ar71xx/Kconfig
index 984222fff08..bae72742145 100644
--- a/target/linux/ar71xx/files/arch/mips/ar71xx/Kconfig
+++ b/target/linux/ar71xx/files/arch/mips/ar71xx/Kconfig
@@ -177,7 +177,7 @@ config AR71XX_MACH_TL_WA901ND
 	select AR71XX_DEV_GPIO_BUTTONS
 	select AR71XX_DEV_LEDS_GPIO
 	default n
-	
+
 config AR71XX_MACH_TL_WR741ND
 	bool "TP-LINK TL-WR741ND support"
 	select AR71XX_DEV_M25P80
@@ -240,6 +240,14 @@ config AR71XX_MACH_EAP7660D
 	select AR71XX_DEV_LEDS_GPIO
 	default n
 
+config AR71XX_MACH_ZCN_1523H
+	bool "Zcomax ZCN-1523H support"
+	select AR71XX_DEV_M25P80
+	select AR71XX_DEV_AP91_PCI if PCI
+	select AR71XX_DEV_GPIO_BUTTONS
+	select AR71XX_DEV_LEDS_GPIO
+	default n
+
 endmenu
 
 config AR71XX_DEV_M25P80
diff --git a/target/linux/ar71xx/files/arch/mips/ar71xx/Makefile b/target/linux/ar71xx/files/arch/mips/ar71xx/Makefile
index 3c732918055..b9c368e1abb 100644
--- a/target/linux/ar71xx/files/arch/mips/ar71xx/Makefile
+++ b/target/linux/ar71xx/files/arch/mips/ar71xx/Makefile
@@ -55,3 +55,4 @@ obj-$(CONFIG_AR71XX_MACH_WP543)		+= mach-wp543.o
 obj-$(CONFIG_AR71XX_MACH_WRT160NL)	+= mach-wrt160nl.o
 obj-$(CONFIG_AR71XX_MACH_WRT400N)	+= mach-wrt400n.o
 obj-$(CONFIG_AR71XX_MACH_WZR_HP_G300NH)	+= mach-wzr-hp-g300nh.o
+obj-$(CONFIG_AR71XX_MACH_ZCN_1523H)	+= mach-zcn-1523h.o
diff --git a/target/linux/ar71xx/files/arch/mips/ar71xx/mach-zcn-1523h.c b/target/linux/ar71xx/files/arch/mips/ar71xx/mach-zcn-1523h.c
new file mode 100644
index 00000000000..b65e13291f5
--- /dev/null
+++ b/target/linux/ar71xx/files/arch/mips/ar71xx/mach-zcn-1523h.c
@@ -0,0 +1,211 @@
+/*
+ *  Zcomax ZCN-1523H-2-8/5-16 board support
+ *
+ *  Copyright (C) 2010 Gabor Juhos <juhosg@openwrt.org>
+ *
+ *  This program is free software; you can redistribute it and/or modify it
+ *  under the terms of the GNU General Public License version 2 as published
+ *  by the Free Software Foundation.
+ */
+
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/partitions.h>
+
+#include <asm/mach-ar71xx/ar71xx.h>
+
+#include "machtype.h"
+#include "devices.h"
+#include "dev-m25p80.h"
+#include "dev-ap91-pci.h"
+#include "dev-gpio-buttons.h"
+#include "dev-leds-gpio.h"
+
+#define ZCN_1523H_GPIO_BTN_RESET	0
+#define ZCN_1523H_GPIO_LED_INIT		11
+#define ZCN_1523H_GPIO_LED_LAN1		17
+
+#define ZCN_1523H_2_GPIO_LED_WEAK	13
+#define ZCN_1523H_2_GPIO_LED_MEDIUM	14
+#define ZCN_1523H_2_GPIO_LED_STRONG	15
+
+#define ZCN_1523H_5_GPIO_LED_UNKNOWN	1
+#define ZCN_1523H_5_GPIO_LED_LAN2	13
+#define ZCN_1523H_5_GPIO_LED_WEAK	14
+#define ZCN_1523H_5_GPIO_LED_MEDIUM	15
+#define ZCN_1523H_5_GPIO_LED_STRONG	16
+
+#define ZCN_1523H_BUTTONS_POLL_INTERVAL	20
+
+#ifdef CONFIG_MTD_PARTITIONS
+static struct mtd_partition zcn_1523h_partitions[] = {
+	{
+		.name		= "u-boot",
+		.offset		= 0,
+		.size		= 0x040000,
+		.mask_flags	= MTD_WRITEABLE,
+	} , {
+		.name		= "u-boot-env",
+		.offset		= 0x040000,
+		.size		= 0x010000,
+		.mask_flags	= MTD_WRITEABLE,
+	} , {
+		.name		= "rootfs",
+		.offset		= 0x050000,
+		.size		= 0x610000,
+	} , {
+		.name		= "kernel",
+		.offset		= 0x660000,
+		.size		= 0x170000,
+	} , {
+		.name		= "configure",
+		.offset		= 0x7d0000,
+		.size		= 0x010000,
+		.mask_flags	= MTD_WRITEABLE,
+	} , {
+		.name		= "mfg",
+		.offset		= 0x7e0000,
+		.size		= 0x010000,
+		.mask_flags	= MTD_WRITEABLE,
+	} , {
+		.name		= "eeprom",
+		.offset		= 0x7f0000,
+		.size		= 0x010000,
+		.mask_flags	= MTD_WRITEABLE,
+	} , {
+		.name		= "firmware",
+		.offset		= 0x050000,
+		.size		= 0x780000,
+	}
+};
+#endif /* CONFIG_MTD_PARTITIONS */
+
+static struct flash_platform_data zcn_1523h_flash_data = {
+#ifdef CONFIG_MTD_PARTITIONS
+        .parts          = zcn_1523h_partitions,
+        .nr_parts       = ARRAY_SIZE(zcn_1523h_partitions),
+#endif
+};
+
+static struct gpio_button zcn_1523h_gpio_buttons[] __initdata = {
+	{
+		.desc		= "reset",
+		.type		= EV_KEY,
+		.code		= KEY_RESTART,
+		.threshold	= 3,
+		.gpio		= ZCN_1523H_GPIO_BTN_RESET,
+		.active_low	= 1,
+	}
+};
+
+static struct gpio_led zcn_1523h_leds_gpio[] __initdata = {
+	{
+		.name		= "zcn-1523h:amber:init",
+		.gpio		= ZCN_1523H_GPIO_LED_INIT,
+		.active_low	= 1,
+	}, {
+		.name		= "zcn-1523h:green:lan1",
+		.gpio		= ZCN_1523H_GPIO_LED_LAN1,
+		.active_low	= 1,
+	}
+};
+
+static struct gpio_led zcn_1523h_2_leds_gpio[] __initdata = {
+	{
+		.name		= "zcn-1523h:red:weak",
+		.gpio		= ZCN_1523H_2_GPIO_LED_WEAK,
+		.active_low	= 1,
+	}, {
+		.name		= "zcn-1523h:amber:medium",
+		.gpio		= ZCN_1523H_2_GPIO_LED_MEDIUM,
+		.active_low	= 1,
+	}, {
+		.name		= "zcn-1523h:green:strong",
+		.gpio		= ZCN_1523H_2_GPIO_LED_STRONG,
+		.active_low	= 1,
+	}
+};
+
+static struct gpio_led zcn_1523h_5_leds_gpio[] __initdata = {
+	{
+		.name		= "zcn-1523h:red:weak",
+		.gpio		= ZCN_1523H_5_GPIO_LED_WEAK,
+		.active_low	= 1,
+	}, {
+		.name		= "zcn-1523h:amber:medium",
+		.gpio		= ZCN_1523H_5_GPIO_LED_MEDIUM,
+		.active_low	= 1,
+	}, {
+		.name		= "zcn-1523h:green:strong",
+		.gpio		= ZCN_1523H_5_GPIO_LED_STRONG,
+		.active_low	= 1,
+	}, {
+		.name		= "zcn-1523h:green:lan2",
+		.gpio		= ZCN_1523H_5_GPIO_LED_LAN2,
+		.active_low	= 1,
+	}, {
+		.name		= "zcn-1523h:amber:unknown",
+		.gpio		= ZCN_1523H_5_GPIO_LED_UNKNOWN,
+	}
+};
+
+static void __init zcn_1523h_generic_setup(void)
+{
+	u8 *mac = (u8 *) KSEG1ADDR(0x1f7e0004);
+	u8 *ee = (u8 *) KSEG1ADDR(0x1fff1000);
+
+	ar71xx_gpio_function_disable(AR724X_GPIO_FUNC_ETH_SWITCH_LED0_EN |
+				     AR724X_GPIO_FUNC_ETH_SWITCH_LED1_EN |
+				     AR724X_GPIO_FUNC_ETH_SWITCH_LED2_EN |
+				     AR724X_GPIO_FUNC_ETH_SWITCH_LED3_EN |
+				     AR724X_GPIO_FUNC_ETH_SWITCH_LED4_EN);
+
+	ar71xx_add_device_m25p80(&zcn_1523h_flash_data);
+
+	ar71xx_add_device_leds_gpio(0, ARRAY_SIZE(zcn_1523h_leds_gpio),
+				    zcn_1523h_leds_gpio);
+
+	ar71xx_add_device_gpio_buttons(-1, ZCN_1523H_BUTTONS_POLL_INTERVAL,
+					ARRAY_SIZE(zcn_1523h_gpio_buttons),
+					zcn_1523h_gpio_buttons);
+
+	ap91_pci_init(ee, mac);
+
+	ar71xx_init_mac(ar71xx_eth0_data.mac_addr, mac, 0);
+	ar71xx_init_mac(ar71xx_eth1_data.mac_addr, mac, 1);
+
+	/* LAN1 port */
+	ar71xx_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_RMII;
+	ar71xx_eth0_data.speed = SPEED_100;
+	ar71xx_eth0_data.duplex = DUPLEX_FULL;
+
+	/* LAN2 port */
+	ar71xx_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_RMII;
+	ar71xx_eth1_data.speed = SPEED_1000;
+	ar71xx_eth1_data.duplex = DUPLEX_FULL;
+
+	ar71xx_add_device_mdio(0x0);
+	ar71xx_add_device_eth(0);
+}
+
+static void __init zcn_1523h_2_setup(void)
+{
+	zcn_1523h_generic_setup();
+
+	ar71xx_add_device_leds_gpio(1, ARRAY_SIZE(zcn_1523h_2_leds_gpio),
+				    zcn_1523h_2_leds_gpio);
+}
+
+MIPS_MACHINE(AR71XX_MACH_ZCN_1523H_2, "ZCN-1523H-2", "Zcomax ZCN-1523H-2",
+	     zcn_1523h_2_setup);
+
+static void __init zcn_1523h_5_setup(void)
+{
+	zcn_1523h_generic_setup();
+
+	ar71xx_add_device_leds_gpio(1, ARRAY_SIZE(zcn_1523h_5_leds_gpio),
+				    zcn_1523h_5_leds_gpio);
+	ar71xx_add_device_eth(1);
+}
+
+MIPS_MACHINE(AR71XX_MACH_ZCN_1523H_5, "ZCN-1523H-5", "Zcomax ZCN-1523H-5",
+	     zcn_1523h_5_setup);
diff --git a/target/linux/ar71xx/files/arch/mips/ar71xx/machtype.h b/target/linux/ar71xx/files/arch/mips/ar71xx/machtype.h
index b9114a884b2..b530abfe411 100644
--- a/target/linux/ar71xx/files/arch/mips/ar71xx/machtype.h
+++ b/target/linux/ar71xx/files/arch/mips/ar71xx/machtype.h
@@ -56,6 +56,8 @@ enum ar71xx_mach_type {
 	AR71XX_MACH_WRT400N,	/* Linksys WRT400N */
 	AR71XX_MACH_WZR_HP_G300NH, /* Buffalo WZR-HP-G300NH */
 	AR71XX_MACH_EAP7660D,	/* Senao EAP7660D */
+	AR71XX_MACH_ZCN_1523H_2, /* Zcomax ZCN-1523H-2-xx */
+	AR71XX_MACH_ZCN_1523H_5, /* Zcomax ZCN-1523H-5-xx */
 };
 
 #endif /* _AR71XX_MACHTYPE_H */