diff --git a/target/linux/ramips/base-files/etc/diag.sh b/target/linux/ramips/base-files/etc/diag.sh
index 395ed6f..0db23b6 100755
--- a/target/linux/ramips/base-files/etc/diag.sh
+++ b/target/linux/ramips/base-files/etc/diag.sh
@@ -33,6 +33,9 @@ get_status_led() {
 	3g-6200n)
 		status_led="edimax:green:power"
 		;;
+        ar725w)
+                status_led="ar725w:green:power"
+                ;;
 	argus-atp52b)
 		status_led="argus-atp52b:green:run"
 		;;
@@ -119,6 +122,9 @@ get_status_led() {
 	wr512-3gn)
 		status_led="wr512:green:wps"
 		;;
+	wrt110)
+		status_led="wrt110:blue:power"
+		;;
 	ur-336un)
 		status_led="ur336:green:wps"
 		;;
diff --git a/target/linux/ramips/base-files/etc/hotplug.d/firmware/10-rt2x00-eeprom b/target/linux/ramips/base-files/etc/hotplug.d/firmware/10-rt2x00-eeprom
index bc4ea02..716eb7d 100644
--- a/target/linux/ramips/base-files/etc/hotplug.d/firmware/10-rt2x00-eeprom
+++ b/target/linux/ramips/base-files/etc/hotplug.d/firmware/10-rt2x00-eeprom
@@ -48,8 +48,10 @@ case "$FIRMWARE" in
 		rt2x00_eeprom_extract "devconf" 0 512
 		;;
 
+	ar725w | \
 	f5d8235-v1 | \
-	f5d8235-v2)
+	f5d8235-v2 | \
+	wrt110)
 		rt2x00_eeprom_extract "u-boot" 262144 512
 		;;
 
diff --git a/target/linux/ramips/base-files/etc/uci-defaults/network b/target/linux/ramips/base-files/etc/uci-defaults/network
index cf9c0bb..78a3ffe 100755
--- a/target/linux/ramips/base-files/etc/uci-defaults/network
+++ b/target/linux/ramips/base-files/etc/uci-defaults/network
@@ -83,8 +83,10 @@ ramips_setup_interfaces()
 		ucidef_add_switch_vlan "switch0" "2" "0 5t"
 		;;
 
+        ar725w | \
 	rt-n15 | \
-	wl-351)
+	wl-351 | \
+        wrt110)
 		ucidef_set_interfaces_lan_wan "eth0.1" "eth0.2"
 		ucidef_add_switch "switch0" "1" "1"
 		ucidef_add_switch_vlan "switch0" "1" "0 1 2 3 5t"
@@ -138,6 +140,7 @@ ramips_setup_macs()
 	dir-615-h1)
 		lan_mac=$(ramips_get_mac_binary factory 40)
 		;;
+
 	3g-6200n | \
 	argus-atp52b | \
 	bc2 | \
@@ -192,7 +195,9 @@ ramips_setup_macs()
                 wan_mac=$(ramips_get_mac_binary factory 40)
 		;;
 
-	f5d8235-v2)
+	ar725w | \
+	f5d8235-v2 | \
+        wrt110)
 		lan_mac=$(ramips_get_mac_binary "u-boot" 262148)
 		wan_mac=$(/usr/sbin/maccalc add "$lan_mac" 1)
 		;;
diff --git a/target/linux/ramips/base-files/lib/preinit/05_init_interfaces_ramips b/target/linux/ramips/base-files/lib/preinit/05_init_interfaces_ramips
new file mode 100644
index 0000000..0539b82
--- /dev/null
+++ b/target/linux/ramips/base-files/lib/preinit/05_init_interfaces_ramips
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+set_preinit_iface() {
+	ifname=eth0
+}
+
+boot_hook_add preinit_main set_preinit_iface
diff --git a/target/linux/ramips/base-files/lib/preinit/06_set_iface_mac b/target/linux/ramips/base-files/lib/preinit/06_set_iface_mac
index b959479..f6c8385 100644
--- a/target/linux/ramips/base-files/lib/preinit/06_set_iface_mac
+++ b/target/linux/ramips/base-files/lib/preinit/06_set_iface_mac
@@ -15,6 +15,11 @@ preinit_set_mac_address() {
 		mac=$(ramips_get_mac_binary factory 4)
 		ifconfig eth0 hw ether $mac 2>/dev/null
 		;;
+        ar725w |\
+        wrt110)
+                mac=$(ramips_get_mac_binary u-boot 262148)
+                ifconfig eth0 hw ether $mac 2>/dev/null
+                ;;
 	bc2 |\
 	dir-620-a1 |\
 	esr-9753 |\
diff --git a/target/linux/ramips/base-files/lib/ramips.sh b/target/linux/ramips/base-files/lib/ramips.sh
index 25a1205..8691db0 100755
--- a/target/linux/ramips/base-files/lib/ramips.sh
+++ b/target/linux/ramips/base-files/lib/ramips.sh
@@ -53,6 +53,9 @@ ramips_board_name() {
 	*"Edimax 3g-6200n")
 		name="3g-6200n"
 		;;
+	*"Airlink101 AR725W")
+		name="ar725w"
+		;;
 	*"Allnet ALL0239-3G")
 		name="all0239-3g"
 		;;
@@ -116,6 +119,9 @@ ramips_board_name() {
 	*"La Fonera 2.0N")
 		name="fonera20n"
 		;;
+	*"Linksys WRT110")
+		name="wrt110"
+		;;
 	*"MoFi Network MOFI3500-3GN")
 		name="mofi3500-3gn"
 		;;
diff --git a/target/linux/ramips/base-files/lib/upgrade/platform.sh b/target/linux/ramips/base-files/lib/upgrade/platform.sh
index 25dbe6e..33850f2 100755
--- a/target/linux/ramips/base-files/lib/upgrade/platform.sh
+++ b/target/linux/ramips/base-files/lib/upgrade/platform.sh
@@ -14,6 +14,7 @@ platform_check_image() {
 	[ "$ARGC" -gt 1 ] && return 1
 
 	case "$board" in
+        ar725w | \
 	3g-6200n | \
 	all0239-3g | \
 	all0256n | \
@@ -54,7 +55,8 @@ platform_check_image() {
 	wli-tx4-ag300n | \
 	whr-g300n |\
 	ur-336un |\
-	wr512-3gn)
+	wr512-3gn |\
+	wrt110)
 		[ "$magic" != "27051956" ] && {
 			echo "Invalid image type."
 			return 1
diff --git a/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/machine.h b/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/machine.h
index 83d2e26..9cc5413 100644
--- a/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/machine.h
+++ b/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/machine.h
@@ -14,9 +14,11 @@
 enum ramips_mach_type {
 	RAMIPS_MACH_GENERIC,
 	/* RT2880 based machines */
+	RAMIPS_MACH_AR725W,		/* Airlink101 AR725W */
 	RAMIPS_MACH_F5D8235_V1,		/* Belkin F5D8235 v1 */
 	RAMIPS_MACH_RT_N15,		/* Asus RT-N15 */
 	RAMIPS_MACH_V11ST_FE,		/* Ralink V11ST-FE */
+	RAMIPS_MACH_WRT110,		/* Linksys WRT110 */
 	RAMIPS_MACH_WLI_TX4_AG300N,	/* Buffalo WLI-TX4-AG300N */
 	RAMIPS_MACH_WZR_AGL300NH,	/* Buffalo WZR-AGL300NH */
 
diff --git a/target/linux/ramips/files/arch/mips/ralink/rt288x/Kconfig b/target/linux/ramips/files/arch/mips/ralink/rt288x/Kconfig
index 31dcc81..70d851f 100644
--- a/target/linux/ramips/files/arch/mips/ralink/rt288x/Kconfig
+++ b/target/linux/ramips/files/arch/mips/ralink/rt288x/Kconfig
@@ -2,6 +2,11 @@ if RALINK_RT288X
 
 menu "Ralink RT288x machine selection"
 
+config RT288X_MACH_AR725W
+	bool "Airlink101 AR725W board support"
+	select RALINK_DEV_GPIO_BUTTONS
+	select RALINK_DEV_GPIO_LEDS
+
 config RT288X_MACH_F5D8235_V1
 	bool "Belkin F5D8235 V1 board support"
 	select RALINK_DEV_GPIO_LEDS
@@ -11,6 +16,11 @@ config RT288X_MACH_RT_N15
 	select RALINK_DEV_GPIO_BUTTONS
 	select RALINK_DEV_GPIO_LEDS
 
+config RT288X_MACH_WRT110
+	bool "Linksys WRT110 board support"
+	select RALINK_DEV_GPIO_BUTTONS
+	select RALINK_DEV_GPIO_LEDS
+
 config RT288X_MACH_V11ST_FE
 	bool "Ralink V11ST-FE board support"
 	select HW_HAS_PCI
diff --git a/target/linux/ramips/files/arch/mips/ralink/rt288x/Makefile b/target/linux/ramips/files/arch/mips/ralink/rt288x/Makefile
index 473f855..f90e4c1 100644
--- a/target/linux/ramips/files/arch/mips/ralink/rt288x/Makefile
+++ b/target/linux/ramips/files/arch/mips/ralink/rt288x/Makefile
@@ -13,8 +13,10 @@ obj-y	:= irq.o setup.o rt288x.o devices.o clock.o
 
 obj-$(CONFIG_EARLY_PRINTK)		+= early_printk.o
 
+obj-$(CONFIG_RT288X_MACH_AR725W)	+= mach-ar725w.o
 obj-$(CONFIG_RT288X_MACH_F5D8235_V1)	+= mach-f5d8235-v1.o
 obj-$(CONFIG_RT288X_MACH_RT_N15)	+= mach-rt-n15.o
 obj-$(CONFIG_RT288X_MACH_V11ST_FE)	+= mach-v11st-fe.o
 obj-$(CONFIG_RT288X_MACH_WLI_TX4_AG300N) += mach-wli-tx4-ag300n.o
+obj-$(CONFIG_RT288X_MACH_WRT110)	+= mach-wrt110.o
 obj-$(CONFIG_RT288X_MACH_WZR_AGL300NH)	+= mach-wzr-agl300nh.o
diff --git a/target/linux/ramips/files/arch/mips/ralink/rt288x/mach-ar725w.c b/target/linux/ramips/files/arch/mips/ralink/rt288x/mach-ar725w.c
new file mode 100644
index 0000000..2a8fcac
--- /dev/null
+++ b/target/linux/ramips/files/arch/mips/ralink/rt288x/mach-ar725w.c
@@ -0,0 +1,98 @@
+/*
+ *  Airlink101 AR725W support
+ *
+ *  Copyright (C) 2014 Claudio Leite <leitec@staticky.com>
+ *
+ *  Based on V11ST-FE support code:
+ *
+ *  Copyright (C) 2012 Florian Fainelli <florian@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/init.h>
+#include <linux/platform_device.h>
+#include <linux/ethtool.h>
+
+#include <asm/mach-ralink/machine.h>
+#include <asm/mach-ralink/dev-gpio-buttons.h>
+#include <asm/mach-ralink/dev-gpio-leds.h>
+#include <asm/mach-ralink/rt288x.h>
+#include <asm/mach-ralink/rt288x_regs.h>
+#include <asm/mach-ralink/ramips_eth_platform.h>
+
+#include "devices.h"
+
+/*
+ * I can't figure out how to turn these on.
+ * They come on fine in the factory firmware
+ * so there may be another GPIO or something
+ * else ANDed with the LED pins here?
+ */
+#define AR725W_GPIO_WPS_RED_LED         8
+#define AR725W_GPIO_WPS_BLUE_LED        13
+
+#define AR725W_GPIO_POWER_LED           7
+
+#define AR725W_GPIO_BUTTON_WPS	        0
+#define AR725W_GPIO_BUTTON_RESET        9
+
+#define AR725W_KEYS_POLL_INTERVAL	20
+#define AR725W_KEYS_DEBOUNCE_INTERVAL	(3 * AR725W_KEYS_POLL_INTERVAL)
+
+static struct gpio_led ar725w_leds_gpio[] __initdata = {
+        {
+            .name           = "ar725w:green:power",
+            .gpio           = AR725W_GPIO_POWER_LED,
+            .active_low     = 0,
+        },
+};
+
+static struct gpio_keys_button ar725w_gpio_buttons[] __initdata = {
+	{
+		.desc		= "wps",
+		.type		= EV_KEY,
+		.code		= KEY_WPS_BUTTON,
+		.debounce_interval = AR725W_KEYS_DEBOUNCE_INTERVAL,
+		.gpio		= AR725W_GPIO_BUTTON_WPS,
+                .active_low     = 1,
+	},
+	{
+		.desc		= "reset",
+		.type		= EV_KEY,
+		.code		= KEY_RESTART,
+		.debounce_interval = AR725W_KEYS_DEBOUNCE_INTERVAL,
+		.gpio		= AR725W_GPIO_BUTTON_RESET,
+		.active_low	= 1,
+	} 
+};
+
+static void __init rt_ar725w_init(void)
+{
+	rt288x_gpio_init(RT2880_GPIO_MODE_UART0);
+
+	rt288x_register_flash(0);
+
+	ramips_register_gpio_leds(-1, ARRAY_SIZE(ar725w_leds_gpio),
+				  ar725w_leds_gpio);
+
+	ramips_register_gpio_buttons(-1, AR725W_KEYS_POLL_INTERVAL,
+				     ARRAY_SIZE(ar725w_gpio_buttons),
+				     ar725w_gpio_buttons);
+
+	rt288x_register_wifi();
+
+	/* Board is connected to an IC+ IP175C Fast Ethernet switch */
+	rt288x_eth_data.speed = SPEED_100;
+	rt288x_eth_data.duplex = DUPLEX_FULL;
+	rt288x_eth_data.tx_fc = 1;
+	rt288x_eth_data.rx_fc = 1;
+	rt288x_eth_data.phy_mask = BIT(0);
+	rt288x_register_ethernet();
+
+	rt288x_register_wdt();
+}
+
+MIPS_MACHINE(RAMIPS_MACH_AR725W, "AR725W", "Airlink101 AR725W", rt_ar725w_init);
diff --git a/target/linux/ramips/files/arch/mips/ralink/rt288x/mach-wrt110.c b/target/linux/ramips/files/arch/mips/ralink/rt288x/mach-wrt110.c
new file mode 100644
index 0000000..3f82526
--- /dev/null
+++ b/target/linux/ramips/files/arch/mips/ralink/rt288x/mach-wrt110.c
@@ -0,0 +1,98 @@
+/*
+ *  Linksys WRT110 support
+ *
+ *  Copyright (C) 2014 Claudio Leite <leitec@staticky.com>
+ *
+ *  Based on V11ST-FE support code:
+ *
+ *  Copyright (C) 2012 Florian Fainelli <florian@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/init.h>
+#include <linux/platform_device.h>
+#include <linux/ethtool.h>
+
+#include <asm/mach-ralink/machine.h>
+#include <asm/mach-ralink/dev-gpio-buttons.h>
+#include <asm/mach-ralink/dev-gpio-leds.h>
+#include <asm/mach-ralink/rt288x.h>
+#include <asm/mach-ralink/rt288x_regs.h>
+#include <asm/mach-ralink/ramips_eth_platform.h>
+
+#include "devices.h"
+
+/*
+ * I can't figure out how to turn these on.
+ * They come on fine in the factory firmware
+ * so there may be another GPIO or something
+ * else ANDed with the LED pins here?
+ */
+#define WRT110_GPIO_WPS_RED_LED         8
+#define WRT110_GPIO_WPS_BLUE_LED        13
+
+#define WRT110_GPIO_POWER_LED           12
+
+#define WRT110_GPIO_BUTTON_WPS	        0
+#define WRT110_GPIO_BUTTON_RESET        9
+
+#define WRT110_KEYS_POLL_INTERVAL	20
+#define WRT110_KEYS_DEBOUNCE_INTERVAL	(3 * WRT110_KEYS_POLL_INTERVAL)
+
+static struct gpio_led wrt110_leds_gpio[] __initdata = {
+        {
+            .name           = "wrt110:blue:power",
+            .gpio           = WRT110_GPIO_POWER_LED,
+            .active_low     = 0,
+        },
+};
+
+static struct gpio_keys_button wrt110_gpio_buttons[] __initdata = {
+	{
+		.desc		= "wps",
+		.type		= EV_KEY,
+		.code		= KEY_WPS_BUTTON,
+		.debounce_interval = WRT110_KEYS_DEBOUNCE_INTERVAL,
+		.gpio		= WRT110_GPIO_BUTTON_WPS,
+                .active_low     = 1,
+	},
+	{
+		.desc		= "reset",
+		.type		= EV_KEY,
+		.code		= KEY_RESTART,
+		.debounce_interval = WRT110_KEYS_DEBOUNCE_INTERVAL,
+		.gpio		= WRT110_GPIO_BUTTON_RESET,
+		.active_low	= 1,
+	} 
+};
+
+static void __init rt_wrt110_init(void)
+{
+	rt288x_gpio_init(RT2880_GPIO_MODE_UART0);
+
+	rt288x_register_flash(0);
+
+	ramips_register_gpio_leds(-1, ARRAY_SIZE(wrt110_leds_gpio),
+				  wrt110_leds_gpio);
+
+	ramips_register_gpio_buttons(-1, WRT110_KEYS_POLL_INTERVAL,
+				     ARRAY_SIZE(wrt110_gpio_buttons),
+				     wrt110_gpio_buttons);
+
+	rt288x_register_wifi();
+
+	/* Board is connected to an IC+ IP175C Fast Ethernet switch */
+	rt288x_eth_data.speed = SPEED_100;
+	rt288x_eth_data.duplex = DUPLEX_FULL;
+	rt288x_eth_data.tx_fc = 1;
+	rt288x_eth_data.rx_fc = 1;
+	rt288x_eth_data.phy_mask = BIT(0);
+	rt288x_register_ethernet();
+
+	rt288x_register_wdt();
+}
+
+MIPS_MACHINE(RAMIPS_MACH_WRT110, "WRT110", "Linksys WRT110", rt_wrt110_init);
diff --git a/target/linux/ramips/image/Makefile b/target/linux/ramips/image/Makefile
index 3c0024b..506dcb4 100644
--- a/target/linux/ramips/image/Makefile
+++ b/target/linux/ramips/image/Makefile
@@ -254,6 +254,55 @@ define BuildFirmware/F5D8235
 	$(call BuildFirmware/Generic,$(1),$(2),$(call mkcmdline,$(3),ttyS1,57600) $(call  mkmtd/phys,$(mtdlayout_f5d8235)),$(mtd_f5d8235_kernel_part_size),$(mtd_f5d8235_rootfs_part_size))
 endef
 
+# Factory layout is 2432k(rootfs),320k(langpack),64k(nvram),64k(factory_nvram)
+# rootfs_part_size=2490368
+#
+# not sure what langpack is, and it seems to be erased by the
+# factory flash (at least the Asante one) so it should be
+# safe to erase for us, too.
+#
+# erasing NVRAM doesn't seem to be a problem.
+# very little appears to be in "factory_nvram" -- the only HW
+# info is in the u-boot partition @ 0x40000.
+# 
+# this does mean you lose your prefs. if reverting to the
+# factory FW, but you can back that up first if that's
+# important.
+#
+# factory flash images have a max size of 0x340000 bytes,
+# since the factory firmware's upgrade process deletes
+# the "langpack" partition
+mtdlayout_ar725w=320k(u-boot)ro,896k(kernel),2880k(rootfs),3776k@0x50000(firmware)
+mtd_ar725w_kernel_part_size=917504
+mtd_ar725w_rootfs_part_size=2949120
+define BuildFirmware/AR725W
+	$(call BuildFirmware/Generic,$(1),$(2),$(call mkcmdline,$(3),ttyS1,57600) $(call  mkmtd/phys,$(mtdlayout_ar725w)),$(mtd_ar725w_kernel_part_size),$(mtd_ar725w_rootfs_part_size))
+	if [ -e "$(call sysupname,$(1),$(2))" ]; then \
+		mkheader_gemtek "$(call sysupname,$(1),$(2))" \
+		 "$(call imgname,$(1),$(2))-factory.bin" 0 || \
+		   rm -f "$(call imgname,$(1),$(2))-factory.bin"; \
+	fi
+endef
+
+define BuildFirmware/AWRT600N
+	$(call BuildFirmware/Generic,$(1),$(2),$(call mkcmdline,$(3),ttyS1,57600) $(call  mkmtd/phys,$(mtdlayout_ar725w)),$(mtd_ar725w_kernel_part_size),$(mtd_ar725w_rootfs_part_size))
+	if [ -e "$(call sysupname,$(1),$(2))" ]; then \
+		mkheader_gemtek "$(call sysupname,$(1),$(2))" \
+		 "$(call imgname,$(1),$(2))-factory.bin" 1 || \
+		   rm -f "$(call imgname,$(1),$(2))-factory.bin"; \
+	fi
+endef
+
+# Linksys WRT110's layout is the same as the AR725W
+define BuildFirmware/WRT110
+	$(call BuildFirmware/Generic,$(1),$(2),$(call mkcmdline,$(3),ttyS1,57600) $(call  mkmtd/phys,$(mtdlayout_ar725w)),$(mtd_ar725w_kernel_part_size),$(mtd_ar725w_rootfs_part_size))
+	if [ -e "$(call sysupname,$(1),$(2))" ]; then \
+		mkheader_gemtek "$(call sysupname,$(1),$(2))" \
+		 "$(call imgname,$(1),$(2))-factory.bin" 2 || \
+		   rm -f "$(call imgname,$(1),$(2))-factory.bin"; \
+	fi
+endef
+
 define BuildFirmware/FONERA20N
 	$(call BuildFirmware/GENERIC_8M,$(1),fonera20n,FONERA20N,ttyS1,57600,phys)
 	$(call BuildFirmware/Edimax,$(1),fonera20n,RSDK,NL1T,0x50000,0xc0000)
@@ -408,6 +457,15 @@ endef
 #
 # RT288X Profiles
 #
+define Image/Build/Profile/AR725W
+	$(call Image/Build/Template/$(fs_squash)/$(1),AR725W,ar725w,AR725W)
+	$(call Image/Build/Template/$(fs_squash)/$(1),AWRT600N,awrt600n,AR725W)
+endef
+
+define Image/Build/Profile/WRT110
+	$(call Image/Build/Template/$(fs_squash)/$(1),WRT110,wrt110,WRT110)
+endef
+
 define Image/Build/Profile/F5D8235V1
 	$(call Image/Build/Template/$(fs_squash)/$(1),F5D8235,f5d8235v1,F5D8235_V1)
 endef
@@ -426,6 +484,7 @@ endef
 
 ifeq ($(CONFIG_RALINK_RT288X),y)
 define Image/Build/Profile/Default
+	$(call Image/Build/Profile/AR725W,$(1))
 	$(call Image/Build/Profile/F5D8235V1,$(1))
 	$(call Image/Build/Profile/RTN15,$(1))
 	$(call Image/Build/Profile/V11STFE,$(1))
diff --git a/target/linux/ramips/rt288x/config-3.3 b/target/linux/ramips/rt288x/config-3.3
index d472e64..90abf46 100644
--- a/target/linux/ramips/rt288x/config-3.3
+++ b/target/linux/ramips/rt288x/config-3.3
@@ -91,9 +91,11 @@ CONFIG_RALINK_RT288X=y
 # CONFIG_RALINK_RT305X is not set
 # CONFIG_RALINK_RT3883 is not set
 CONFIG_RAMIPS_WDT=y
+CONFIG_RT288X_MACH_AR725W=y
 CONFIG_RT288X_MACH_F5D8235_V1=y
 CONFIG_RT288X_MACH_RT_N15=y
 CONFIG_RT288X_MACH_V11ST_FE=y
+CONFIG_RT288X_MACH_WRT110=y
 CONFIG_RT288X_MACH_WLI_TX4_AG300N=y
 CONFIG_RT288X_MACH_WZR_AGL300NH=y
 CONFIG_RTL8366S_PHY=y
diff --git a/target/linux/ramips/rt288x/profiles/airlink101.mk b/target/linux/ramips/rt288x/profiles/airlink101.mk
new file mode 100644
index 0000000..36a4ccc
--- /dev/null
+++ b/target/linux/ramips/rt288x/profiles/airlink101.mk
@@ -0,0 +1,18 @@
+#
+# Copyright (C) 2011 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+define Profile/AR725W
+       NAME:=Airlink101 AR725W
+       PACKAGES:=kmod-switch-ip17xx kmod-swconfig swconfig
+endef
+
+define Profile/AR725W/Description
+       Package set for Airlink101 AR725W
+endef
+
+$(eval $(call Profile,AR725W))
+
diff --git a/target/linux/ramips/rt288x/profiles/wrt110.mk b/target/linux/ramips/rt288x/profiles/wrt110.mk
new file mode 100644
index 0000000..34e1c5b
--- /dev/null
+++ b/target/linux/ramips/rt288x/profiles/wrt110.mk
@@ -0,0 +1,18 @@
+#
+# Copyright (C) 2011 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+define Profile/WRT110
+       NAME:=Linksys WRT110
+       PACKAGES:=kmod-switch-ip17xx kmod-swconfig swconfig
+endef
+
+define Profile/WRT110/Description
+       Package set for Linksys WRT110
+endef
+
+$(eval $(call Profile,WRT110))
+
diff --git a/tools/firmware-utils/Makefile b/tools/firmware-utils/Makefile
index 3fdf2d0..bd8d71c 100644
--- a/tools/firmware-utils/Makefile
+++ b/tools/firmware-utils/Makefile
@@ -62,6 +62,7 @@ define Host/Compile
 	$(call cc, mkcameofw, -Wall)
 	$(call cc,seama md5)
 	$(call cc,fix-u-media-header cyg_crc32,-Wall)
+	$(call cc,mkheader_gemtek,-lz)
 endef
 
 define Host/Install
diff --git a/tools/firmware-utils/src/mkheader_gemtek.c b/tools/firmware-utils/src/mkheader_gemtek.c
new file mode 100644
index 0000000..2ca6f2a
--- /dev/null
+++ b/tools/firmware-utils/src/mkheader_gemtek.c
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2014  Claudio Leite <leitec@staticky.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/*
+ * Builds a proper flash image for routers using some Gemtek
+ * OEM boards. These include the Airlink101 AR725W, the
+ * Asante SmartHub 600 (AWRT-600N), and Linksys WRT110.
+ *
+ * The resulting image is compatible with the factory firmware
+ * web upgrade and TFTP interface.
+ *
+ * To build:
+ *  gcc -O2 -o mkheader_gemtek mkheader_gemtek.c -lz
+ *
+ * Claudio Leite <leitec@staticky.com>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+
+#include <zlib.h> /* for crc32() */
+
+/*
+ * The header is in little-endian format. In case
+ * we are on a BE host, we need to swap binary
+ * values.
+ */
+#if defined(__linux__)
+# include <endian.h>
+#elif defined(__APPLE__)
+#include <libkern/OSByteOrder.h>
+#define le32 OSSwapHostToLittleInt32
+#else
+# include <sys/endian.h> /* BSD's should have this */
+#endif
+
+#ifndef __APPLE__
+# if __BYTE_ORDER == __BIG_ENDIAN
+#  define le32(x) (((x & 0xFF000000) >> 24) | \
+                   ((x & 0x00FF0000) >> 8)  | \
+                   ((x & 0x0000FF00) << 8)  | \
+                   ((x & 0x000000FF) << 24))
+# else
+#  define le32(x) (x)
+# endif
+#endif
+
+struct gemtek_header {
+    uint8_t magic[4];
+    uint8_t version[4];
+    uint32_t product_id;
+    uint32_t imagesz;
+    uint32_t checksum;
+    uint32_t fast_checksum;
+    uint8_t build[4];
+    uint8_t lang[4];
+};
+
+struct machines {
+    char *desc;
+    uint32_t maxsize;
+    struct gemtek_header header;
+};
+
+struct machines mach_def[] = {
+    { "Airlink101 AR725W", 0x340000,
+      { "GMTK", "1003", le32(0x03000001), 0, 0,
+          0, "01\0\0",  "EN\0\0" }},
+    { "Asante AWRT-1600N", 0x340000,
+      { "A600", "1005", le32(0x03000001), 0, 0,
+          0, "01\0\0",  "EN\0\0" }},
+    { "Linksys WRT110",    0x320000,
+      { "GMTK", "1007", le32(0x03040001), 0, 0,
+          0, "2\0\0\0", "EN\0\0" }},
+    { 0 }
+};
+
+int main(int argc, char *argv[])
+{
+    unsigned long res, flen;
+    struct gemtek_header my_hdr;
+    FILE *f, *f_out;
+    int image_type = 0, index;
+    uint8_t *buf;
+    uint32_t crc;
+
+    if(argc < 3) {
+        fprintf(stderr, "mkheader_gemtek <uImage> <webflash image> [machine ID]\n");
+        fprintf(stderr, "  where [machine ID] is one of:\n");
+        for(index = 0; mach_def[index].desc != 0; index++) {
+            fprintf(stderr, "    %2d  %s", index, mach_def[index].desc);
+            if(index == 0)
+                fprintf(stderr, " (default)\n");
+            else
+                fprintf(stderr, "\n");
+        }
+
+        exit(-1);
+    }
+
+    if(argc == 4) {
+        image_type = atoi(argv[3]);
+    }
+
+    printf("Opening %s...\n", argv[1]);
+
+    f = fopen(argv[1], "r");
+
+    fseek(f, 0, SEEK_END);
+    flen = (unsigned long)ftell(f);
+
+    printf("  %lu (0x%lX) bytes long\n", flen, flen);
+
+    if(flen > mach_def[image_type].maxsize) {
+        fprintf(stderr, "\nERROR: image exceeds maximum compatible size\n");
+        fclose(f);
+        exit(-1);
+    }
+
+    buf = malloc(flen+32);
+
+    rewind(f);
+    res = fread(buf+32, 1, flen, f);
+    if(res != flen) {
+        perror("Couldn't read entire file: fread()");
+        fclose(f);
+        exit(-1);
+    }
+
+    fclose(f);
+
+    printf("\nCreating %s...\n", argv[2]);
+
+    memcpy(&my_hdr, &mach_def[image_type].header, sizeof(struct gemtek_header));
+
+    printf("  Using %s magic\n", mach_def[image_type].desc);
+
+    my_hdr.imagesz = le32(flen + 0x20);
+    memcpy(my_hdr.lang, "EN", 2);
+
+    memcpy(buf, &my_hdr, 32);
+
+    crc = crc32(0, buf, flen+32);
+    printf("  CRC32: %08X\n", crc);
+
+    my_hdr.checksum = le32(crc);
+    memcpy(buf, &my_hdr, 32);
+
+    printf("  Writing...\n");
+    f_out = fopen(argv[2], "w");
+
+    fwrite(buf, 1, flen + 32, f_out);
+
+    fclose(f_out);
+
+    free(buf);
+    return 0;
+}
