diff --git a/docs/features/wlan-configuration.rst b/docs/features/wlan-configuration.rst
index 08528196e8d068f18a81e7b6e7b06a443542a69d..4f6ea2ded837013e1e89bca8e08ccdd8654aeca9 100644
--- a/docs/features/wlan-configuration.rst
+++ b/docs/features/wlan-configuration.rst
@@ -19,7 +19,7 @@ During upgrades the wifi channel of the 2.4GHz and 5GHz radio will be restored t
 configured in the site.conf. If you need to preserve a user defined wifi channel during upgrades
 you can configure this via the uci section ``gluon-core.wireless``::
 
-  uci set gluon-core.@wireless[0].preserve_channels='1'
+  uci set gluon.wireless.preserve_channels='1'
 
 When channels should be preserved, toggling the outdoor mode will have no effect on the channel settings.
 Therefore, the Outdoor mode settings won't be displayed in config mode.
diff --git a/package/gluon-core/luasrc/lib/gluon/upgrade/190-preserve-wireless-channels b/package/gluon-core/luasrc/lib/gluon/upgrade/190-preserve-wireless-channels
new file mode 100755
index 0000000000000000000000000000000000000000..ee25c13087530e6ed4588f7446eb128e7c7d2d6b
--- /dev/null
+++ b/package/gluon-core/luasrc/lib/gluon/upgrade/190-preserve-wireless-channels
@@ -0,0 +1,23 @@
+#!/usr/bin/lua
+
+local wireless = require 'gluon.wireless'
+local uci = require('simple-uci').cursor()
+
+local preserve_channels = wireless.preserve_channels(uci)
+
+-- Migrate preserve channels from pre-2022.01
+local core_wireless = uci:get_first('gluon-core', 'wireless')
+if core_wireless ~= nil then
+	local preserve_legacy = uci:get_bool('gluon-core', core_wireless, 'preserve_channels')
+	if preserve_legacy then
+		preserve_channels = true
+	end
+
+	uci:delete('gluon-core', core_wireless)
+	uci:save('gluon-core')
+end
+
+uci:section('gluon', 'wireless', 'wireless', {
+	preserve_channels = preserve_channels or false,
+})
+uci:save('gluon')
diff --git a/package/gluon-core/luasrc/usr/lib/lua/gluon/wireless.lua b/package/gluon-core/luasrc/usr/lib/lua/gluon/wireless.lua
index 62fe32287aeb0c94007fef2150f201f79732f423..ea6343b9266fde3a55c135f56fa1a955ce58c375 100644
--- a/package/gluon-core/luasrc/usr/lib/lua/gluon/wireless.lua
+++ b/package/gluon-core/luasrc/usr/lib/lua/gluon/wireless.lua
@@ -123,7 +123,7 @@ function M.foreach_radio(uci, f)
 end
 
 function M.preserve_channels(uci)
-	return uci:get('gluon', 'wireless', 'preserve_channels')
+	return uci:get_bool('gluon', 'wireless', 'preserve_channels')
 end
 
 function M.device_supports_wpa3()