diff --git a/docs/index.rst b/docs/index.rst
index b019b45c4f38ca6ad63b8d98aba13a80d7ddec91..ae3f44912e80fde59985eab2bc3527c666cbf75b 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -55,6 +55,7 @@ Several Freifunk communities in Germany use Gluon as the foundation of their Fre
 
    package/gluon-client-bridge
    package/gluon-config-mode-contact-info
+   package/gluon-config-mode-domain-select
    package/gluon-config-mode-geo-location
    package/gluon-ebtables-filter-multicast
    package/gluon-ebtables-filter-ra-dhcp
diff --git a/docs/package/gluon-config-mode-domain-select.rst b/docs/package/gluon-config-mode-domain-select.rst
new file mode 100644
index 0000000000000000000000000000000000000000..3af15fdace9c3ff092c57e7c4b42fe6f2402d542
--- /dev/null
+++ b/docs/package/gluon-config-mode-domain-select.rst
@@ -0,0 +1,19 @@
+gluon-config-mode-domain-select
+===============================
+This package provides a drop-down list for the config mode to select the domain
+the node will be placed in. If the selection has changed the upgrade scripts in
+``/lib/gluon/upgrade/`` are triggered to update the nodes configuration.
+
+Hiding domains could be useful for default or testing domains, which should not
+be accidentally selected by a node operater.
+
+domains/*.conf
+---------------------
+
+hide_domain \: optional (defaults to false)
+    - ``false`` shows this domain in drop-down list
+    - ``true`` hides this domain
+
+Example::
+
+  hide_domain = true
diff --git a/docs/site-example/i18n/de.po b/docs/site-example/i18n/de.po
index 70f00a712c67575881ada429e2ec8d0cdac12423..c5738333b83d2a872e47e563ee751dfe3919ae7a 100644
--- a/docs/site-example/i18n/de.po
+++ b/docs/site-example/i18n/de.po
@@ -16,6 +16,15 @@ msgstr ""
 "Freifunk-Knoten. Fülle das folgende Formular deinen Vorstellungen "
 "entsprechend aus und sende es ab."
 
+msgid "gluon-config-mode:domain"
+msgstr "Domäne"
+
+msgid "gluon-config-mode:domain-select"
+msgstr ""
+"Hier hast du die Möglichkeit, die Mesh-Domäne, in der sich dein Knoten "
+"befindet, auszuwählen. Bitte denke daran, dass sich dein Knoten nur mit den "
+"Knoten der ausgewählten Domäne verbinden kann."
+
 msgid "gluon-config-mode:pubkey"
 msgstr ""
 "<p>Dies ist der öffentliche Schlüssel deines Freifunk-Knotens. Erst nachdem "
diff --git a/docs/site-example/i18n/en.po b/docs/site-example/i18n/en.po
index 181ebce1562130929904d4e6e2326746086efd5b..0a014a3b146ddb034e8307323c16fd873377e634 100644
--- a/docs/site-example/i18n/en.po
+++ b/docs/site-example/i18n/en.po
@@ -15,6 +15,15 @@ msgstr ""
 "Welcome to the setup wizard of your new Freifunk Alpha Centauri node. "
 "Please fill out the following form and submit it."
 
+msgid "gluon-config-mode:domain"
+msgstr "Domain"
+
+msgid "gluon-config-mode:domain-select"
+msgstr ""
+"Here you have the possibility of selecting the mesh domain in which your node "
+"is placed. Please keep in mind that your router only connects with the nodes "
+"of the selected domain"
+
 msgid "gluon-config-mode:pubkey"
 msgstr ""
 "<p>This is your Freifunk node's public key. The node won't be able to "
diff --git a/docs/site-example/i18n/fr.po b/docs/site-example/i18n/fr.po
index bd4aef44b7b2abcd16b0d3bb5d9bef9de78a52b8..69522c4c286db856b4fcf00ad50f19c527bdc498 100644
--- a/docs/site-example/i18n/fr.po
+++ b/docs/site-example/i18n/fr.po
@@ -16,6 +16,12 @@ msgstr ""
 "Freifunk. Remplissez le formulaire suivant en fonction de vos besoins "
 "et enregistrez le"
 
+msgid "gluon-config-mode:domain"
+msgstr "Domaine"
+
+msgid "gluon-config-mode:domain-select"
+msgstr ""
+
 msgid "gluon-config-mode:pubkey"
 msgstr ""
 "<p>Ceci est la clé publique de votre nœud Freifunk. Seulment après que la clé soit "
diff --git a/docs/site-example/i18n/gluon-site.pot b/docs/site-example/i18n/gluon-site.pot
index 7fe3293cf510835ee2bfeaa6ecea32d064177a7f..b3138d2858c5e41e35e32b4f192103f9316a90e4 100644
--- a/docs/site-example/i18n/gluon-site.pot
+++ b/docs/site-example/i18n/gluon-site.pot
@@ -4,6 +4,12 @@ msgstr "Content-Type: text/plain; charset=UTF-8"
 msgid "gluon-config-mode:welcome"
 msgstr ""
 
+msgid "gluon-config-mode:domain"
+msgstr ""
+
+msgid "gluon-config-mode:domain-select"
+msgstr ""
+
 msgid "gluon-config-mode:pubkey"
 msgstr ""
 
diff --git a/package/gluon-config-mode-domain-select/Makefile b/package/gluon-config-mode-domain-select/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..72fe80e2806d3164a36ea27153ca7e018021b17d
--- /dev/null
+++ b/package/gluon-config-mode-domain-select/Makefile
@@ -0,0 +1,42 @@
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=gluon-config-mode-domain-select
+PKG_VERSION:=1
+
+PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
+
+include ../gluon.mk
+
+PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG)
+
+
+define Package/gluon-config-mode-domain-select
+  SECTION:=gluon
+  CATEGORY:=Gluon
+  TITLE:=UI for changing the node-config
+  DEPENDS:=+gluon-config-mode-core @GLUON_MULTIDOMAIN
+endef
+
+define Build/Prepare
+	mkdir -p $(PKG_BUILD_DIR)
+endef
+
+define Build/Configure
+endef
+
+define Build/Compile
+	$(call GluonBuildI18N,gluon-config-mode-domain-select,i18n)
+	$(call GluonSrcDiet,./luasrc,$(PKG_BUILD_DIR)/luadest/)
+endef
+
+define Package/gluon-config-mode-domain-select/install
+	$(CP) $(PKG_BUILD_DIR)/luadest/* $(1)/
+	$(call GluonInstallI18N,gluon-config-mode-domain-select,$(1))
+endef
+
+define Package/gluon-config-domain-select/postinst
+#!/bin/sh
+$(call GluonCheckSite,check_site.lua)
+endef
+
+$(eval $(call BuildPackage,gluon-config-mode-domain-select))
diff --git a/package/gluon-config-mode-domain-select/check_site.lua b/package/gluon-config-mode-domain-select/check_site.lua
new file mode 100644
index 0000000000000000000000000000000000000000..18994ecdc3bc4218c9be87dab88c1f3cbea93da1
--- /dev/null
+++ b/package/gluon-config-mode-domain-select/check_site.lua
@@ -0,0 +1 @@
+need_boolean(in_domain({'hide_domain'}), false)
diff --git a/package/gluon-config-mode-domain-select/luasrc/lib/gluon/config-mode/wizard/0200-domain-select.lua b/package/gluon-config-mode-domain-select/luasrc/lib/gluon/config-mode/wizard/0200-domain-select.lua
new file mode 100644
index 0000000000000000000000000000000000000000..f82f1fb660dd5e0a5e504467f306ecb55b5928da
--- /dev/null
+++ b/package/gluon-config-mode-domain-select/luasrc/lib/gluon/config-mode/wizard/0200-domain-select.lua
@@ -0,0 +1,54 @@
+return function(form, uci)
+	local fs = require 'nixio.fs'
+	local json = require 'jsonc'
+	local site = require 'gluon.site'
+
+	local selected_domain = uci:get('gluon', 'core', 'domain')
+	local configured = uci:get_first('gluon-setup-mode','setup_mode', 'configured') == '1' or (selected_domain ~= site.default_domain())
+
+	local function get_domain_list()
+		local list = {}
+		for domain_path in fs.glob('/lib/gluon/domains/*.json') do
+			local domain_code = domain_path:match('([^/]+)%.json$')
+			local domain = assert(json.load(domain_path))
+
+			if not domain.hide_domain or (configured and domain.domain_code == selected_domain) then
+				table.insert(list, {
+					domain_code = domain_code,
+					domain_name = domain.domain_names[domain_code],
+				})
+			end
+		end
+
+		table.sort(list, function(a, b) return a.domain_name < b.domain_name end)
+		return list
+	end
+
+	local s = form:section(Section, nil, translate('gluon-config-mode:domain-select'))
+	local o = s:option(ListValue, 'domain', translate('gluon-config-mode:domain'))
+
+	if configured then
+		o.default = selected_domain
+	end
+
+	for _, domain in ipairs(get_domain_list()) do
+		o:value(domain.domain_code, domain.domain_name)
+	end
+
+	local domain_changed = false
+
+	function o:write(data)
+		if data ~= selected_domain then
+			domain_changed = true
+			uci:set('gluon', 'core', 'domain', data)
+		end
+	end
+
+	local function reconfigure()
+		if domain_changed then
+			os.execute('gluon-reconfigure')
+		end
+	end
+
+	return {'gluon', reconfigure}
+end