return function(form, uci)
	local site_i18n = i18n 'gluon-site'

	local fs = require 'nixio.fs'
	local json = require 'jsonc'
	local site = require 'gluon.site'
	local util = require 'gluon.util'

	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 hide_domain_code(domain, code)
		if configured and code == selected_domain then
			return false
		elseif type(domain.hide_domain) == 'table' then
			return util.contains(domain.hide_domain, code)
		else
			return domain.hide_domain
		end
	end

	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 hide_domain_code(domain, domain_code) 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, site_i18n.translate('gluon-config-mode:domain-select'))
	local o = s:option(ListValue, 'domain', site_i18n.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