diff --git a/docs/index.rst b/docs/index.rst
index 19e174c9745d87f40726b8ce74683517704b9d34..2b4bc8db2a763ffe64814217ec23e02267207e6e 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -49,6 +49,8 @@ Packages
 .. toctree::
    :maxdepth: 1
 
+   package/gluon-radio-config
+
 Releases
 --------
 
diff --git a/docs/package/gluon-radio-config.rst b/docs/package/gluon-radio-config.rst
new file mode 100644
index 0000000000000000000000000000000000000000..b253b15455e2e0ac14ae8ca0dd2a1b307914a83c
--- /dev/null
+++ b/docs/package/gluon-radio-config.rst
@@ -0,0 +1,20 @@
+gluon-radio-config
+==================
+
+This package takes care of setting basic wireless settings:
+
+- regulatory domain
+- htmode
+- channel
+
+site.conf
+---------
+
+regdom
+    regulatory domain (e.g. *de*)
+
+wifi24.channel / wifi5.channel
+    wireless channel for radio
+
+wifi24.htmode / wifi5.htmode
+    desired HT mode (e.g. *HT20*)
diff --git a/package/gluon-core/files/usr/lib/lua/gluon/util.lua b/package/gluon-core/files/usr/lib/lua/gluon/util.lua
index cf3677cb76611c97e0d87167512e00e1ceaff22e..7d7809b1aff5abce2863b1fd8043b778501825eb 100644
--- a/package/gluon-core/files/usr/lib/lua/gluon/util.lua
+++ b/package/gluon-core/files/usr/lib/lua/gluon/util.lua
@@ -26,9 +26,13 @@ end
 local os = os
 local string = string
 local tonumber = tonumber
+local ipairs = ipairs
+local table = table
 
 local nixio = require 'nixio'
 local sysconfig = require 'gluon.sysconfig'
+local site = require 'gluon.site_config'
+local uci = require('luci.model.uci').cursor()
 
 
 module 'gluon.util'
@@ -77,3 +81,26 @@ function generate_mac(f, i)
 
   return string.format('%02x:%02x:%02x:%s:%s:%s', m1, m2, m3, m4, m5, m6)
 end
+
+-- Iterate over all radios defined in UCI calling
+-- f(radio, index, site.wifiX) for each radio found while passing
+--  site.wifi24 for 2.4 GHz devices and site.wifi5 for 5 GHz ones.
+function iterate_radios(f)
+  local radios = {}
+
+  uci:foreach('wireless', 'wifi-device',
+    function(s)
+      table.insert(radios, s['.name'])
+    end
+  )
+
+  for index, radio in ipairs(radios) do
+    local hwmode = uci:get('wireless', radio, 'hwmode')
+
+    if hwmode == '11g' or hwmode == '11ng' then
+      f(radio, index, site.wifi24)
+    elseif hwmode == '11a' or hwmode == '11na' then
+      f(radio, index, site.wifi5)
+    end
+  end
+end
diff --git a/package/gluon-mesh-batman-adv-core/Makefile b/package/gluon-mesh-batman-adv-core/Makefile
index 8358089cdfaf8191e89cdd08943a998ae0c84394..bb3dc53786bbb3507a8e2cd3ee73bc878bf17afa 100644
--- a/package/gluon-mesh-batman-adv-core/Makefile
+++ b/package/gluon-mesh-batman-adv-core/Makefile
@@ -11,7 +11,7 @@ define Package/gluon-mesh-batman-adv-core
   SECTION:=gluon
   CATEGORY:=Gluon
   TITLE:=Support for batman-adv meshing (core)
-  DEPENDS:=+gluon-core +firewall +libiwinfo-lua
+  DEPENDS:=+gluon-core +gluon-radio-config +firewall +libiwinfo-lua
 endef
 
 define Build/Prepare
diff --git a/package/gluon-mesh-batman-adv-core/check_site.lua b/package/gluon-mesh-batman-adv-core/check_site.lua
index 25ae9dff4c3b9200cdac8b289b5f174936360e81..2c5badc2bdf725544eca67dfad83ceb971972211 100644
--- a/package/gluon-mesh-batman-adv-core/check_site.lua
+++ b/package/gluon-mesh-batman-adv-core/check_site.lua
@@ -1,9 +1,4 @@
-need_string('regdom')
-
 for _, config in ipairs({'wifi24', 'wifi5'}) do
-   need_number(config .. '.channel')
-   need_string(config .. '.htmode')
-
    if need_table(config .. '.ap', nil, false) then
       need_string(config .. '.ap.ssid')
       need_boolean(config .. '.ap.disabled', false)
diff --git a/package/gluon-mesh-batman-adv-core/files/lib/gluon/upgrade/320-gluon-mesh-batman-adv-core-wireless b/package/gluon-mesh-batman-adv-core/files/lib/gluon/upgrade/320-gluon-mesh-batman-adv-core-wireless
index cd9f885a5d07c57701e7bb68cb59e6ffa61471a6..2c16d0e00716334a4272cc76666412e36f72bee2 100755
--- a/package/gluon-mesh-batman-adv-core/files/lib/gluon/upgrade/320-gluon-mesh-batman-adv-core-wireless
+++ b/package/gluon-mesh-batman-adv-core/files/lib/gluon/upgrade/320-gluon-mesh-batman-adv-core-wireless
@@ -118,36 +118,12 @@ end
 local function configure_radio(radio, index, config)
   local suffix = radio:match('^radio(%d+)$')
 
-  uci:delete('wireless', radio, 'disabled')
-
-  uci:set('wireless', radio, 'channel', config.channel)
-  uci:set('wireless', radio, 'htmode', config.htmode)
-  uci:set('wireless', radio, 'country', site.regdom)
-
   configure_client(config.ap, radio, index, suffix)
   configure_ibss(config.ibss, radio, index, suffix)
   configure_mesh(config.mesh, radio, index, suffix)
 end
 
-
-local radios = {}
-
-uci:foreach('wireless', 'wifi-device',
-  function(s)
-    table.insert(radios, s['.name'])
-  end
-)
-
-for index, radio in ipairs(radios) do
-  local hwmode = uci:get('wireless', radio, 'hwmode')
-
-  if hwmode == '11g' or hwmode == '11ng' then
-    configure_radio(radio, index, site.wifi24)
-  elseif hwmode == '11a' or hwmode == '11na' then
-    configure_radio(radio, index, site.wifi5)
-  end
-end
-
+util.iterate_radios(configure_radio)
 
 uci:save('wireless')
 uci:save('network')
diff --git a/package/gluon-radio-config/Makefile b/package/gluon-radio-config/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..9157e80448202cb912ba8cf2f0d22952097f0a6c
--- /dev/null
+++ b/package/gluon-radio-config/Makefile
@@ -0,0 +1,31 @@
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=gluon-radio-config
+PKG_VERSION:=1
+
+PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
+
+include $(GLUONDIR)/include/package.mk
+
+define Package/gluon-radio-config
+  SECTION:=gluon
+  CATEGORY:=Gluon
+  TITLE:=Basic radio config (regdom, channel, htmode)
+  DEPENDS:=+gluon-core
+endef
+
+define Build/Prepare
+	mkdir -p $(PKG_BUILD_DIR)
+endef
+
+define Build/Configure
+endef
+
+define Build/Compile
+endef
+
+define Package/gluon-radio-config/install
+	$(CP) ./files/* $(1)/
+endef
+
+$(eval $(call BuildPackage,gluon-radio-config))
diff --git a/package/gluon-radio-config/check_site.lua b/package/gluon-radio-config/check_site.lua
new file mode 100644
index 0000000000000000000000000000000000000000..b804d9fe609de3c397e36ea914cfd1e7732de41a
--- /dev/null
+++ b/package/gluon-radio-config/check_site.lua
@@ -0,0 +1,6 @@
+need_string('regdom')
+
+for _, config in ipairs({'wifi24', 'wifi5'}) do
+   need_number(config .. '.channel')
+   need_string(config .. '.htmode')
+end
diff --git a/package/gluon-radio-config/files/lib/gluon/upgrade/250-gluon-radio-config b/package/gluon-radio-config/files/lib/gluon/upgrade/250-gluon-radio-config
new file mode 100755
index 0000000000000000000000000000000000000000..62e6dcdee41094fb436403f11338ddd37800f4c7
--- /dev/null
+++ b/package/gluon-radio-config/files/lib/gluon/upgrade/250-gluon-radio-config
@@ -0,0 +1,18 @@
+#!/usr/bin/lua
+
+local util = require 'gluon.util'
+local uci = require('luci.model.uci').cursor()
+local site = require 'gluon.site_config'
+
+local function configure_radio(radio, index, config)
+  uci:delete('wireless', radio, 'disabled')
+
+  uci:set('wireless', radio, 'channel', config.channel)
+  uci:set('wireless', radio, 'htmode', config.htmode)
+  uci:set('wireless', radio, 'country', site.regdom)
+end
+
+util.iterate_radios(configure_radio)
+
+uci:save('wireless')
+uci:commit('wireless')