diff --git a/buildscript.sh b/buildscript.sh
index 0c11e316c242464da5f7dd53d137539469323715..2f7b494fa986698c443bbcb04a2d77142f44f0b3 100755
--- a/buildscript.sh
+++ b/buildscript.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-GLUON_REMOTE_BRANCH="v2020.2.x"
+GLUON_REMOTE_BRANCH="v2021.1.x"
 
 # get location of executed file.
 EXECDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
@@ -100,17 +100,23 @@ prepare_siteconf(){
     echo "Placeholder %B not found"
   fi
   if grep -q "%C" < "$EXECDIR"/site.conf; then
-    sed -i "/^%C$/c\\\\'http://autoupdate-lede.ffnw/v1/$vpn/testing\\'," "$EXECDIR"/site.conf
-    echo "Set autoupdater testing URL ..."
+    sed -i "/^%C$/c\\\\'http://autoupdate-lede.ffnw/v1/$vpn/rc\\'," "$EXECDIR"/site.conf
+    echo "Set autoupdater rc URL ..."
   else
     echo "Placeholder %C not found"
   fi
   if grep -q "%D" < "$EXECDIR"/site.conf; then
-    sed -i "/^%D$/c\\\\'http://autoupdate-lede.ffnw/v1/$vpn/nightly/master\\'," "$EXECDIR"/site.conf
-    echo "Set autoupdater nightly_master URL ..."
+    sed -i "/^%D$/c\\\\'http://autoupdate-lede.ffnw/v1/$vpn/testing\\'," "$EXECDIR"/site.conf
+    echo "Set autoupdater testing URL ..."
   else
     echo "Placeholder %D not found"
   fi
+  if grep -q "%E" < "$EXECDIR"/site.conf; then
+    sed -i "/^%E$/c\\\\'http://autoupdate-lede.ffnw/v1/$vpn/nightly/master\\'," "$EXECDIR"/site.conf
+    echo "Set autoupdater nightly_master URL ..."
+  else
+    echo "Placeholder %E not found"
+  fi
 }
 
 prepare_sitemk(){
@@ -149,24 +155,24 @@ gluon_build(){
   if [ "$2" == "fast" ] && [ -a "/proc/cpuinfo" ]; then
       if [ "$3" == "silent" ]; then
         if [ -a "$EXECDIR/.BROKEN" ]; then
-          if ! make --silent -C "$EXECDIR/.." -j $(($(grep -c processor /proc/cpuinfo)*2)) BROKEN=1 GLUON_TARGET="$1" GLUON_IMAGEDIR="output/images/$(cat "$EXECDIR/.prepare")/$(cat "$EXECDIR/.GLUON_RELEASE")" GLUON_PACKAGEDIR="output/packages/$(cat "$EXECDIR/.prepare")";
+          if ! make --silent -C "$EXECDIR/.." -j $(($(grep -c processor /proc/cpuinfo)*2)) BROKEN=1 GLUON_TARGET="$1" GLUON_AUTOUPDATER_ENABLED=1 GLUON_IMAGEDIR="output/images/$(cat "$EXECDIR/.prepare")/$(cat "$EXECDIR/.GLUON_RELEASE")" GLUON_PACKAGEDIR="output/packages/$(cat "$EXECDIR/.prepare")";
           then
             error_build=1
           fi
         else
-          if ! make --silent -C "$EXECDIR/.." -j $(($(grep -c processor /proc/cpuinfo)*2)) GLUON_TARGET="$1" GLUON_IMAGEDIR="output/images/$(cat "$EXECDIR/.prepare")/$(cat "$EXECDIR/.GLUON_RELEASE")" GLUON_PACKAGEDIR="output/packages/$(cat "$EXECDIR/.prepare")";
+          if ! make --silent -C "$EXECDIR/.." -j $(($(grep -c processor /proc/cpuinfo)*2)) GLUON_TARGET="$1" GLUON_AUTOUPDATER_ENABLED=1 GLUON_IMAGEDIR="output/images/$(cat "$EXECDIR/.prepare")/$(cat "$EXECDIR/.GLUON_RELEASE")" GLUON_PACKAGEDIR="output/packages/$(cat "$EXECDIR/.prepare")";
           then
             error_build=1
           fi
         fi
       else
         if [ -a "$EXECDIR/.BROKEN" ]; then
-          if ! make -C "$EXECDIR/.." -j $(($(grep -c processor /proc/cpuinfo)*2)) BROKEN=1 GLUON_TARGET="$1" GLUON_IMAGEDIR="output/images/$(cat "$EXECDIR/.prepare")/$(cat "$EXECDIR/.GLUON_RELEASE")" GLUON_PACKAGEDIR="output/packages/$(cat "$EXECDIR/.prepare")";
+          if ! make -C "$EXECDIR/.." -j $(($(grep -c processor /proc/cpuinfo)*2)) BROKEN=1 GLUON_TARGET="$1" GLUON_AUTOUPDATER_ENABLED=1 GLUON_IMAGEDIR="output/images/$(cat "$EXECDIR/.prepare")/$(cat "$EXECDIR/.GLUON_RELEASE")" GLUON_PACKAGEDIR="output/packages/$(cat "$EXECDIR/.prepare")";
           then
             error_build=1
           fi
         else
-          if ! make -C "$EXECDIR/.." -j $(($(grep -c processor /proc/cpuinfo)*2)) GLUON_TARGET="$1" GLUON_IMAGEDIR="output/images/$(cat "$EXECDIR/.prepare")/$(cat "$EXECDIR/.GLUON_RELEASE")" GLUON_PACKAGEDIR="output/packages/$(cat "$EXECDIR/.prepare")";
+          if ! make -C "$EXECDIR/.." -j $(($(grep -c processor /proc/cpuinfo)*2)) GLUON_TARGET="$1" GLUON_AUTOUPDATER_ENABLED=1 GLUON_IMAGEDIR="output/images/$(cat "$EXECDIR/.prepare")/$(cat "$EXECDIR/.GLUON_RELEASE")" GLUON_PACKAGEDIR="output/packages/$(cat "$EXECDIR/.prepare")";
           then
             error_build=1
           fi
@@ -174,12 +180,12 @@ gluon_build(){
       fi
   else
     if [ -a "$EXECDIR/.BROKEN" ]; then
-      if ! make -C "$EXECDIR/.." BROKEN=1 GLUON_TARGET="$1" GLUON_IMAGEDIR="output/images/$(cat "$EXECDIR/.prepare")/$(cat "$EXECDIR/.GLUON_RELEASE")" GLUON_PACKAGEDIR="output/packages/$(cat "$EXECDIR/.prepare")";
+      if ! make -C "$EXECDIR/.." BROKEN=1 GLUON_TARGET="$1" GLUON_AUTOUPDATER_ENABLED=1 GLUON_IMAGEDIR="output/images/$(cat "$EXECDIR/.prepare")/$(cat "$EXECDIR/.GLUON_RELEASE")" GLUON_PACKAGEDIR="output/packages/$(cat "$EXECDIR/.prepare")";
       then
         error_build=1
       fi
     else
-      if ! make -C "$EXECDIR/.." GLUON_TARGET="$1" GLUON_IMAGEDIR="output/images/$(cat "$EXECDIR/.prepare")/$(cat "$EXECDIR/.GLUON_RELEASE")" GLUON_PACKAGEDIR="output/packages/$(cat "$EXECDIR/.prepare")";
+      if ! make -C "$EXECDIR/.." GLUON_TARGET="$1" GLUON_AUTOUPDATER_ENABLED=1 GLUON_IMAGEDIR="output/images/$(cat "$EXECDIR/.prepare")/$(cat "$EXECDIR/.GLUON_RELEASE")" GLUON_PACKAGEDIR="output/packages/$(cat "$EXECDIR/.prepare")";
       then
         error_build=1
       fi
diff --git a/gluon_patches/0004-patches-openwrt-add-0016-ath9k-check-for-deaf-rx-pat.patch b/gluon_patches/0004-patches-openwrt-add-0016-ath9k-check-for-deaf-rx-pat.patch
deleted file mode 100644
index 57097083dc12c9a3081f73f3f03e5f2f21ec626d..0000000000000000000000000000000000000000
--- a/gluon_patches/0004-patches-openwrt-add-0016-ath9k-check-for-deaf-rx-pat.patch
+++ /dev/null
@@ -1,147 +0,0 @@
-From 16e48445555a8597a7d6dde41138dff4bc66d139 Mon Sep 17 00:00:00 2001
-From: Jan-Tarek Butt <tarek@ring0.de>
-Date: Sat, 5 Sep 2020 11:45:57 +0200
-Subject: [PATCH 4/4] patches/openwrt: add
- 0016-ath9k-check-for-deaf-rx-path-state.patch to fix 0% bug on meshlinks
-
-Signed-off-by: Jan-Tarek Butt <tarek@ring0.de>
----
- ...6-ath9k-check-for-deaf-rx-path-state.patch | 126 ++++++++++++++++++
- 1 file changed, 126 insertions(+)
- create mode 100644 patches/openwrt/0016-ath9k-check-for-deaf-rx-path-state.patch
-
-diff --git a/patches/openwrt/0016-ath9k-check-for-deaf-rx-path-state.patch b/patches/openwrt/0016-ath9k-check-for-deaf-rx-path-state.patch
-new file mode 100644
-index 00000000..1c200536
---- /dev/null
-+++ b/patches/openwrt/0016-ath9k-check-for-deaf-rx-path-state.patch
-@@ -0,0 +1,126 @@
-+From: Jan-Tarek Butt <tarek@ring0.de>
-+Date: Sat, 5 Sep 2020 11:18:59 +0200
-+Subject: ath9k: check for deaf rx path state
-+
-+Various chips occasionally run into a state where the tx path still
-+appears to be working normally, but the rx path is deaf.
-+
-+There is no known register signature to check for this state explicitly,
-+so use the lack of rx interrupts as an indicator.
-+
-+This detection is prone to false positives, since a device could also
-+simply be in an environment where there are no frames on the air.
-+However, in this case doing a reset should be harmless since it's
-+obviously not interrupting any real activity. To avoid confusion, call
-+the reset counters in this case "Rx path inactive" instead of something
-+like "Rx path deaf", since it may not be an indication of a real
-+hardware failure.
-+
-+Signed-off-by: Jan-Tarek Butt <tarek@ring0.de>
-+
-+diff --git a/package/kernel/mac80211/patches/ath/359-ath9k-check-for-deaf-rx-path-state.patch b/package/kernel/mac80211/patches/ath/359-ath9k-check-for-deaf-rx-path-state.patch
-+new file mode 100644
-+index 0000000000000000000000000000000000000000..347d06ec888c56102523ed40b38aa4b5083d4c9c
-+--- /dev/null
-++++ b/package/kernel/mac80211/patches/ath/359-ath9k-check-for-deaf-rx-path-state.patch
-+@@ -0,0 +1,100 @@
-++From: Felix Fietkau <nbd@nbd.name>
-++Date: Wed, 25 Jan 2017 13:00:58 +0100
-++Subject: [PATCH] ath9k: check for deaf rx path state
-++
-++Various chips occasionally run into a state where the tx path still
-++appears to be working normally, but the rx path is deaf.
-++
-++There is no known register signature to check for this state explicitly,
-++so use the lack of rx interrupts as an indicator.
-++
-++This detection is prone to false positives, since a device could also
-++simply be in an environment where there are no frames on the air.
-++However, in this case doing a reset should be harmless since it's
-++obviously not interrupting any real activity. To avoid confusion, call
-++the reset counters in this case "Rx path inactive" instead of something
-++like "Rx path deaf", since it may not be an indication of a real
-++hardware failure.
-++
-++Signed-off-by: Felix Fietkau <nbd@nbd.name>
-++---
-++
-++--- a/drivers/net/wireless/ath/ath9k/ath9k.h
-+++++ b/drivers/net/wireless/ath/ath9k/ath9k.h
-++@@ -1027,6 +1027,7 @@ struct ath_softc {
-++
-++ 	u8 gtt_cnt;
-++ 	u32 intrstatus;
-+++	u32 rx_active;
-++ 	u16 ps_flags; /* PS_* */
-++ 	bool ps_enabled;
-++ 	bool ps_idle;
-++--- a/drivers/net/wireless/ath/ath9k/debug.c
-+++++ b/drivers/net/wireless/ath/ath9k/debug.c
-++@@ -763,6 +763,7 @@ static int read_file_reset(struct seq_fi
-++ 		[RESET_TYPE_BEACON_STUCK] = "Stuck Beacon",
-++ 		[RESET_TYPE_MCI] = "MCI Reset",
-++ 		[RESET_TYPE_CALIBRATION] = "Calibration error",
-+++		[RESET_TYPE_RX_INACTIVE] = "Rx path inactive",
-++ 		[RESET_TX_DMA_ERROR] = "Tx DMA stop error",
-++ 		[RESET_RX_DMA_ERROR] = "Rx DMA stop error",
-++ 	};
-++--- a/drivers/net/wireless/ath/ath9k/debug.h
-+++++ b/drivers/net/wireless/ath/ath9k/debug.h
-++@@ -50,6 +50,7 @@ enum ath_reset_type {
-++ 	RESET_TYPE_BEACON_STUCK,
-++ 	RESET_TYPE_MCI,
-++ 	RESET_TYPE_CALIBRATION,
-+++	RESET_TYPE_RX_INACTIVE,
-++ 	RESET_TX_DMA_ERROR,
-++ 	RESET_RX_DMA_ERROR,
-++ 	__RESET_TYPE_MAX
-++--- a/drivers/net/wireless/ath/ath9k/link.c
-+++++ b/drivers/net/wireless/ath/ath9k/link.c
-++@@ -53,13 +53,27 @@ reset:
-++
-++ }
-++
-+++static bool ath_rx_active_check(struct ath_softc *sc)
-+++{
-+++	if (sc->rx_active) {
-+++		sc->rx_active = 0;
-+++		return true;
-+++	}
-+++
-+++	ath_dbg(ath9k_hw_common(sc->sc_ah), RESET,
-+++		"rx path inactive, resetting the chip\n");
-+++	ath9k_queue_reset(sc, RESET_TYPE_RX_INACTIVE);
-+++	return false;
-+++}
-+++
-++ void ath_hw_check_work(struct work_struct *work)
-++ {
-++ 	struct ath_softc *sc = container_of(work, struct ath_softc,
-++ 					    hw_check_work.work);
-++
-++ 	if (!ath_hw_check(sc) ||
-++-	    !ath_tx_complete_check(sc))
-+++	    !ath_tx_complete_check(sc) ||
-+++	    !ath_rx_active_check(sc))
-++ 		return;
-++
-++ 	ieee80211_queue_delayed_work(sc->hw, &sc->hw_check_work,
-++--- a/drivers/net/wireless/ath/ath9k/main.c
-+++++ b/drivers/net/wireless/ath/ath9k/main.c
-++@@ -269,6 +269,7 @@ static bool ath_complete_reset(struct at
-++ 	}
-++
-++ 	sc->gtt_cnt = 0;
-+++	sc->rx_active = 1;
-++
-++ 	ath9k_hw_set_interrupts(ah);
-++ 	ath9k_hw_enable_interrupts(ah);
-++@@ -452,6 +453,7 @@ void ath9k_tasklet(unsigned long data)
-++ 			ath_rx_tasklet(sc, 0, true);
-++
-++ 		ath_rx_tasklet(sc, 0, false);
-+++		sc->rx_active = 1;
-++ 	}
-++
-++ 	if (status & ATH9K_INT_TX) {
--- 
-2.20.1
-
diff --git a/site.conf b/site.conf
index 4da7c640b1eab35378e09314a818199dd82116fa..d39acb07c50b649464cf91b907d33a07649b4219 100644
--- a/site.conf
+++ b/site.conf
@@ -24,6 +24,7 @@
 	},
 	wifi5 = {
 		channel = 44,
+		outdoor_chanlist = '100-140',
 		mesh = {
 			mcast_rate = 12000,
 		},
@@ -70,10 +71,24 @@
 					'e3d2e96563b9be3e95a3d748c0ff50a6f854208b68b4a1181667641d74754c76', --stefan
 				},
 			},
+			rc = {
+				name = 'stable',
+				mirrors = {
+%C
+				},
+				good_signatures = 1,
+				pubkeys = {
+					'99c420e95dd0923ee6277af5c306f9ae6b97f8793b08edd41448925df5fe35b9', --floh1111
+					'5d95cc2ef3ad17fe3716469e1effde4a49a25d4de9befa4a6eb260e4cda79ab0', --tata
+					'0e6704ba26c150185514a391658455a612839c35bd83e0faffa81e0be48356e2', --sk
+					'd3a4cbc90a2d4dbfc5386dd035016a04bfdfe1e7615fa8ea25bea5c048a7f106', --lrnzo
+					'e3d2e96563b9be3e95a3d748c0ff50a6f854208b68b4a1181667641d74754c76', --stefan
+				},
+			},
 			testing = {
 				name = 'testing',
 				mirrors = {
-%C
+%D
 				},
 				good_signatures = 1,
 				pubkeys = {
@@ -87,7 +102,7 @@
 			nightly_master = {
 				name = 'nightly_master',
 				mirrors = {
-%D
+%E
 				},
 				good_signatures = 1,
 				pubkeys = {