diff --git a/target/linux/ipq806x/base-files/etc/board.d/01_leds 
b/target/linux/ipq806x/base-files/etc/board.d/01_leds
index b32c1cc..f57453e 100755
--- a/target/linux/ipq806x/base-files/etc/board.d/01_leds
+++ b/target/linux/ipq806x/base-files/etc/board.d/01_leds
@@ -20,6 +20,8 @@ r7500)
      ucidef_set_led_default "wps" "WPS" "r7500:white:wps" "0"
      ucidef_set_led_default "rfkill" "rfkill" "r7500:white:rfkill" "0"
      ;;
+ea8500)
+    ucidef_set_led_default "wps" "WPS" "ea8500:green:wps" "0"
  *)
      ;;
  esac
diff --git a/target/linux/ipq806x/base-files/etc/board.d/02_network 
b/target/linux/ipq806x/base-files/etc/board.d/02_network
index 55d78cd..8465919 100755
--- a/target/linux/ipq806x/base-files/etc/board.d/02_network
+++ b/target/linux/ipq806x/base-files/etc/board.d/02_network
@@ -6,6 +6,7 @@

  . /lib/functions/uci-defaults.sh
  . /lib/ipq806x.sh
+. /lib/functions/system.sh

  board_config_update

@@ -24,8 +25,15 @@ db149)
          "1:lan" "2:lan" "3:lan" "4:lan" "6@eth1" "5:wan" "0@eth0"
      ;;
  ea8500)
+
+    hw_mac_addr=$(mtd_get_mac_ascii devinfo hw_mac_addr)
+
      ucidef_add_switch "switch0" \
          "1:lan" "2:lan" "3:lan" "4:lan" "0t@eth0" "5:wan" "0t@eth0"
+
+    ucidef_set_interface_macaddr "lan" "$hw_mac_addr"
+    ucidef_set_interface_macaddr "wan" "$hw_mac_addr"
+
      ;;
  *)
      echo "Unsupported hardware. Network interfaces not intialized"
diff --git a/target/linux/ipq806x/base-files/etc/init.d/linksys_recovery 
b/target/linux/ipq806x/base-files/etc/init.d/linksys_recovery
new file mode 100755
index 0000000..b9ea004
--- /dev/null
+++ b/target/linux/ipq806x/base-files/etc/init.d/linksys_recovery
@@ -0,0 +1,20 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2015 OpenWrt.org
+
+START=97
+boot() {
+. /lib/functions.sh
+. /lib/ipq806x.sh
+
+case $(ipq806x_board_name) in
+    ea8500)
+        # make sure auto_recovery in uboot is always on
+        AUTO_RECOVERY_ENA="`fw_printenv -n auto_recovery`"
+        if [ "$AUTO_RECOVERY_ENA" != "yes" ] ; then
+            fw_setenv auto_recovery yes
+        fi
+        # reset the boot counter
+        mtd resetbc s_env
+        ;;
+esac
+}
diff --git a/target/linux/ipq806x/base-files/lib/ipq806x.sh 
b/target/linux/ipq806x/base-files/lib/ipq806x.sh
index db22708..fcc5a43 100644
--- a/target/linux/ipq806x/base-files/lib/ipq806x.sh
+++ b/target/linux/ipq806x/base-files/lib/ipq806x.sh
@@ -26,6 +26,9 @@ ipq806x_board_detect() {
      *"R7500")
          name="r7500"
          ;;
+    *"Linksys EA8500"*)
+        name="ea8500"
+        ;;
      esac

      [ -z "$name" ] && name="unknown"
diff --git a/target/linux/ipq806x/base-files/lib/upgrade/linksys.sh 
b/target/linux/ipq806x/base-files/lib/upgrade/linksys.sh
new file mode 100644
index 0000000..ca5161a
--- /dev/null
+++ b/target/linux/ipq806x/base-files/lib/upgrade/linksys.sh
@@ -0,0 +1,88 @@
+#
+# Copyright (C) 2014-2015 OpenWrt.org
+#
+
+linksys_get_target_firmware() {
+    cur_boot_part=`/usr/sbin/fw_printenv -n boot_part`
+    target_firmware=""
+    if [ "$cur_boot_part" = "1" ]
+    then
+        # current primary boot - update alt boot
+        target_firmware="kernel2"
+        fw_setenv boot_part 2
+        #In EA8500 bootcmd is always "bootipq", so don't change
+        #fw_setenv bootcmd "run altnandboot"
+    elif [ "$cur_boot_part" = "2" ]
+    then
+        # current alt boot - update primary boot
+        target_firmware="kernel1"
+        fw_setenv boot_part 1
+        #In EA8500 bootcmd is always "bootipq", so don't change
+        #fw_setenv bootcmd "run nandboot"
+    fi
+
+    # re-enable recovery so we get back if the new firmware is broken
+    fw_setenv auto_recovery yes
+
+    echo "$target_firmware"
+}
+
+linksys_get_root_magic() {
+    (get_image "$@" | dd skip=786432 bs=4 count=1 | hexdump -v -n 4 -e 
'1/1 "%02x"') 2>/dev/null
+}
+
+platform_do_upgrade_linksys() {
+    local magic_long="$(get_magic_long "$1")"
+
+    mkdir -p /var/lock
+    local part_label="$(linksys_get_target_firmware)"
+    touch /var/lock/fw_printenv.lock
+
+    if [ ! -n "$part_label" ]
+    then
+        echo "cannot find target partition"
+        exit 1
+    fi
+
+    local target_mtd=$(find_mtd_part $part_label)
+
+    [ "$magic_long" = "73797375" ] && {
+        CI_KERNPART="$part_label"
+        if [ "$part_label" = "kernel1" ]
+        then
+            CI_UBIPART="rootfs1"
+        else
+            CI_UBIPART="rootfs2"
+        fi
+
+        nand_upgrade_tar "$1"
+    }
+    [ "$magic_long" = "27051956" ] && {
+        # check firmwares' rootfs types
+        local target_mtd=$(find_mtd_part $part_label)
+        local oldroot="$(linksys_get_root_magic $target_mtd)"
+        local newroot="$(linksys_get_root_magic "$1")"
+
+        if [ "$newroot" = "55424923" -a "$oldroot" = "55424923" ]
+        # we're upgrading from a firmware with UBI to one with UBI
+        then
+            # erase everything to be safe
+            mtd erase $part_label
+            get_image "$1" | mtd -n write - $part_label
+        else
+            get_image "$1" | mtd write - $part_label
+        fi
+    }
+}
+
+linksys_preupgrade() {
+    export RAMFS_COPY_BIN="${RAMFS_COPY_BIN} /usr/sbin/fw_printenv 
/usr/sbin/fw_setenv"
+    export RAMFS_COPY_BIN="${RAMFS_COPY_BIN} /bin/mkdir /bin/touch"
+    export RAMFS_COPY_DATA="${RAMFS_COPY_DATA} /etc/fw_env.config 
/var/lock/fw_printenv.lock"
+
+    [ -f /tmp/sysupgrade.tgz ] && {
+        cp /tmp/sysupgrade.tgz /tmp/syscfg/sysupgrade.tgz
+    }
+}
+
+append sysupgrade_pre_upgrade linksys_preupgrade
diff --git a/target/linux/ipq806x/base-files/lib/upgrade/platform.sh 
b/target/linux/ipq806x/base-files/lib/upgrade/platform.sh
index 542b5ce..f155572 100644
--- a/target/linux/ipq806x/base-files/lib/upgrade/platform.sh
+++ b/target/linux/ipq806x/base-files/lib/upgrade/platform.sh
@@ -8,7 +8,8 @@ platform_check_image() {
      case "$board" in
      ap148 |\
      d7800 |\
-    r7500)
+    r7500 |\
+    ea8500)
          nand_do_platform_check $board $1
          return $?;
          ;;
@@ -26,7 +27,21 @@ platform_pre_upgrade() {
      r7500)
          nand_do_upgrade "$1"
          ;;
+    ea8500)
+        linksys_preupgrade "$1"
+        ;;
      esac
  }

-# use default for platform_do_upgrade()
+platform_do_upgrade() {
+    local board=$(ipq806x_board_name)
+
+    case "$board" in
+    ea8500)
+        platform_do_upgrade_linksys "$ARGV"
+        ;;
+    *)
+        default_do_upgrade "$ARGV"
+        ;;
+    esac
+}
diff --git a/target/linux/ipq806x/base-files/lib/preinit/04_caldata 
b/target/linux/ipq806x/base-files/lib/preinit/04_caldata
new file mode 100644
index 0000000..0cc89a0
--- /dev/null
+++ b/target/linux/ipq806x/base-files/lib/preinit/04_caldata
@@ -0,0 +1,32 @@
+#!/bin/sh
+#
+# Copyright (C) 2015 OpenWrt.org
+#
+
+do_ath10k_caldata() {
+
+    . /lib/ipq806x.sh
+    . /lib/functions.sh
+    . /lib/functions/system.sh
+
+    board=$(ipq806x_board_name)
+    DIR=/lib/firmware
+
+    case $board in
+        ea8500)
+            hw_mac_addr=$(mtd_get_mac_ascii devinfo hw_mac_addr)
+
+            FIRMWARE="ath10k/cal-pci-0000:01:00.0.bin"
+            [ -f $DIR/$FIRMWARE ] || caldata -i art -o 0x1000 -s 0x4000 
-a $hw_mac_addr -f $DIR/$FIRMWARE
+
+            FIRMWARE="ath10k/cal-pci-0001:01:00.0.bin"
+            [ -f $DIR/$FIRMWARE ] || caldata -i art -o 0x5000 -s 0x4000 
-a $hw_mac_addr -f $DIR/$FIRMWARE
+            ;;
+
+        *)
+            exit 1
+            ;;
+    esac
+}
+
+boot_hook_add preinit_mount_root do_ath10k_caldata
