diff --git a/.gitignore b/.gitignore
index b25c15b..e63911a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,3 @@
 *~
+info
+sites/
diff --git a/README.md b/README.md
index 50a73cf..d9e669a 100644
--- a/README.md
+++ b/README.md
@@ -1,16 +1,50 @@
 #### How to build the Freifunk Hamburg Firmware
 
-    git clone https://github.com/freifunk-gluon/gluon.git            # Get the official Gluon repository
-    cd gluon
-    git clone https://github.com/freifunkhamburg/site-ffhh.git site  # Get the Freifunk Hamburg site repository
-    make update                                                    # Get other repositories used by Gluon
-    make                                                           # Build Gluon
+	In the next two commands replace GLUON_VERSION and SITE_VERSION with the actual version numbers.
+	$ git clone -b GLUON_VERSION https://github.com/freifunk-gluon/gluon.git
+	$ git clone -b SITE_VERSION https://git.hamburg.ccc.de/freifunk/site-ffhh.git
+	$ cd site-ffhh
+
+	To build the firmware into the subdirectory firmware:
+	$ ./build.sh -g ../gluon -o firmware
+
+	The build.sh supports the argument -b if you wish to also build firmware images marked as broken in gluon.
 
 Please see [the official Gluon repository](https://github.com/freifunk-gluon/gluon) for an in-depth explanation of the build process.
 
 
 #### Gluon versions used for specific Hamburg Freifunk Firmware builds
 
+- v2023.2.4.0: site-ffhh: v2023.2.4.0, gluon: v2023.2.4
+- v2023.2.2.1: site-ffhh: v2023.2.2.0, gluon: v2023.2.2 (add mediatek-filogic Routers)
+- v2023.2.2.0: site-ffhh: v2023.2.2.0, gluon: v2023.2.2
+- v2023.1.2.0: site-ffhh: v2023.1.2.0, gluon: v2023.1.2
+- v2022.1.4.0: site-ffhh: v2022.1.4.0, gluon: v2022.1.4
+- v2022.1.3.0: site-ffhh: v2022.1.3.0, gluon: v2022.1.3 (nur experimental verteilt)
+- v2021.1.2.0: site-ffhh: v2021.1.2.0, gluon: v2021.1.2
+- v2021.1.1.0: site-ffhh: v2021.1.1.0, gluon: v2021.1.1
+- v2020.2.3.0: site-ffhh: v2020.2.3.0, gluon: v2020.2.3
+- v2020.2.2.0: site-ffhh: v2020.2.2.0, gluon: v2020.2.2
+- v2020.1.4.0: site-ffhh: v2020.1.4.0, gluon: v2020.1.4
+- v2020.1.3.0: site-ffhh: v2020.1.3.0, gluon: v2020.1.3
+- v2019.1.2.0: site-ffhh: v2019.1.2.0, gluon: v2019.1.2
+- v2018.2.3.0: site-ffhh: v2018.2.3.0, gluon: v2018.2.3
+- v2018.2.1.0: site-ffhh: v2018.2.1.0, gluon: v2018.2.1
+- v2018.1.4.2: site-ffhh: v2018.1.4.2, gluon: v2018.1.4
+- v2018.1.4.1: site-ffhh: v2018.1.4.1, gluon: v2018.1.4
+- v2018.1.4.0: site-ffhh: v2018.1.4.0, gluon: v2018.1.4
+- v2018.1.3.0: site-ffhh: v2018.1.3.0, gluon: v2018.1.3
+- v2018.1.1.0: site-ffhh: v2018.1.1.0, gluon: v2018.1.1
+- v2018.1.0.0: site-ffhh: v2018.1.0.0, gluon: v2018.1 (never rolled out due to issues with the auto updater in gluon)
+- 0.9.2: site-ffhh: v0.9.2, gluon: v2017.1.8
+- 0.9.1: site-ffhh: v0.9.1, gluon: v2017.1.5
+- 0.9.0: site-ffhh: 60f30382209ffc050baa82be9bad3622a1d88d5b, gluon: v2017.1.x (9295abcea7b016b0fe4b05c534ea0731b48ef593) (never rolled out due to 0.9.1)
+- 0.8.6: v2016.2.7 Fix gw01-new key, add 3.ntp.services.ffhh to NTP servers, add Firmware signing keys for Alexander and Olli, remove old domain
+- 0.8.5: v2016.2.7 Domain split, new package: ffho-ebtables-net-rules
+- 0.8.4: v2016.2.7 (updated openwrt/package/network/services/dnsmasq/Makefile: PKG\_VERSION:=2.78 & PKG\_MD5SUM:=6d0241b72c79d2b510776ccc4ed69ca4)
+- 0.8.3: v2016.2.6 (ffhh-sued only)
+- 0.8.2: v2016.2.5
+- 0.8.1: v2016.2.4 (ffhh-sued only)
 - 0.8: v2016.1.4
 - 0.7.1: v2015.1.2
 - 0.7: v2015.1
diff --git a/build.conf b/build.conf
new file mode 100644
index 0000000..07358e1
--- /dev/null
+++ b/build.conf
@@ -0,0 +1,5 @@
+GLUON_RELEASE="v2023.2.4.0"
+targets="ath79-generic ath79-nand ath79-mikrotik bcm27xx-bcm2708 bcm27xx-bcm2709 ipq40xx-generic ipq40xx-mikrotik ipq806x-generic lantiq-xrx200 lantiq-xway mediatek-filogic mediatek-mt7622 mpc85xx-p1010 mpc85xx-p1020 ramips-mt7620 ramips-mt7621 ramips-mt76x8 rockchip-armv8 sunxi-cortexa7 x86-generic x86-geode x86-legacy x86-64"
+broken_images=(
+	'*dir*615*d*'
+)
diff --git a/build.sh b/build.sh
new file mode 100755
index 0000000..5647ba5
--- /dev/null
+++ b/build.sh
@@ -0,0 +1,138 @@
+#!/usr/bin/env bash
+set -e
+
+function announce () {
+	echo '############################' "$@" >&2
+}
+function usage () {
+	echo "Usage: $0 -g GLUON_PATH" >&2
+	echo "       -g GLUON_PATH   Path to a checkout of the gluon repository." >&2
+	echo "       -t TARGETS      Comma separated list of gluon targets to build" >&2
+	echo "       -a              Automatically detect and build all targets." >&2
+	echo "       -o OUT_PATH     Path to the firmware output directory. Default: ${gluon_out}" >&2
+	echo "       -s SIGNATURE    Sign firmware with signature" >&2
+	echo "       -stable         Set GLUON_AUTOUPDATER_BRANCH=stable" >&2
+	echo "       -b              BROKEN=1" >&2
+	echo "       -v              verbose" >&2
+	echo "       -j JOBS         Run build with -jJOBS. Default: ${proc}" >&2
+}
+
+proc=$(nproc)
+gluon_out="${HOME}/firmware"
+
+while [ $# -gt 0 ]; do
+	case "$1" in
+		-a)
+			auto_targets=1
+			;;
+		-g)
+			gluon_path="$2"
+			shift
+			;;
+		-t)
+			build_targets="$2"
+			shift
+			;;
+		-o)
+			gluon_out="$2"
+			shift
+			;;
+		-s)
+			signature="$2"
+			shift
+			;;
+		-stable)
+			export GLUON_AUTOUPDATER_BRANCH=stable
+			;;
+		-b)
+			export BROKEN=1
+			;;
+		-j)
+			proc="$2"
+			shift
+			;;
+		-v)
+			verbose=V=s
+			;;
+		*)
+			echo ERROR: Failed to parse: "${1}" >&2
+			usage
+			exit 1
+			;;
+	esac
+	shift
+done
+
+if [ -z "$gluon_path" ]; then
+	usage
+	exit 1
+fi
+
+gluon_path=$(realpath "$gluon_path")
+gluon_out=$(realpath "$gluon_out")
+site_path=$(realpath "$(dirname "${BASH_SOURCE[0]}")")
+
+announce GLUON: "$gluon_path" >&2
+announce FFHH SITE PATH: "$site_path" >&2
+
+pushd "$site_path"
+# shellcheck source=/dev/null
+. ./build.conf
+GLUON_AUTOUPDATER_BRANCH="${GLUON_AUTOUPDATER_BRANCH:-experimental}"
+[ "${GLUON_AUTOUPDATER_BRANCH}" = "experimental" ] && GLUON_RELEASE="${GLUON_RELEASE}~exp${BUILD_DATE:-$(date +%Y%m%d)}"
+export GLUON_RELEASE
+export GLUON_AUTOUPDATER_BRANCH
+export GLUON_SITEDIR="${site_path}"
+export GLUON_OUTPUTDIR="${gluon_out}/${GLUON_RELEASE}/${GLUON_AUTOUPDATER_BRANCH}"
+popd
+
+announce GLUON Variables:
+env | egrep '^GLUON' | sort
+
+pushd "${gluon_path}"
+announce Starting make update...
+mkdir -p "${GLUON_OUTPUTDIR}"
+make update
+# Try to install patches. I wasn't able to figure out how patches in gluon/site/patches work.
+for p in "${site_path}"/patches/*.patch; do
+	if [ -e "$p" ] && [ ! -f "${gluon_path}/${p##*/}" ]; then
+		announce "Installing patch $p"
+		patch -p1 < "$p"
+		touch "${gluon_path}/${p##*/}"
+	fi
+done
+
+if [ "$auto_targets" = "1" ]; then
+	# detect available targets
+	targets="$(make list-targets | sort | xargs)"
+else
+	# if a list of build targets has been supplied, only build those
+	targets="$(echo "${build_targets:-$targets}" | sed -e 's_,_ _g')"
+fi
+announce "The following targets will be generated: $targets" >&2
+
+for t in $targets; do
+	announce "Starting build for $t..." >&2
+	make "-j$(nproc)" "GLUON_TARGET=$t" $verbose
+done
+# Remove known-broken images
+# shellcheck disable=SC2154
+for broken_image in "${broken_images[@]}"; do
+	announce "Removing broken image ${broken_image}..."
+	find "${GLUON_OUTPUTDIR}/images" -iname "${broken_image}" \( -type f -o -type l \) -ls -exec rm -f {} \;
+done
+# Generate the images.list
+# shellcheck disable=SC2094
+( cd "${GLUON_OUTPUTDIR}/images" && ( echo "RELEASE=${GLUON_RELEASE}"; find . -type f ! -iname '*.manifest' ! -iname images.list; find . -type l ! -iname '*.manifest' ) | sed -e 's!^\./\(.*\)$!\1!' -e 's!/! !g' | sort > images.list )
+announce Building manifest...
+make manifest
+if [ -n "${signature}" ]; then
+	if [ "$GLUON_AUTOUPDATER_BRANCH" == "experimental" ]; then
+		announce Signing...
+		"${gluon_path}/contrib/sign.sh" "${signature}" "${GLUON_OUTPUTDIR}/images/sysupgrade/experimental.manifest"
+	else
+		echo ERROR: can only sign experimental branch >&2
+		exit 1
+	fi
+fi
+popd
diff --git a/domains/ffhh_nowe.conf b/domains/ffhh_nowe.conf
new file mode 100644
index 0000000..4ecba48
--- /dev/null
+++ b/domains/ffhh_nowe.conf
@@ -0,0 +1,75 @@
+{
+	domain_names = {
+		ffhh_nowe = "Hamburg Nordwest",
+	},
+	domain_seed = '666668682D6E6F776548616D6275726748616D6275726748616D627572674861',
+
+	prefix4 = '10.112.192.0/19',
+	prefix6 = '2a03:2267:3::/64',
+
+	next_node = {
+		ip4 = '10.112.192.1',
+		ip6 = '2a03:2267:3::1',
+		mac = '16:41:95:40:f7:dc',
+	},
+
+	wifi24 = {
+		ap = {
+			ssid = "hamburg.freifunk.net",
+		},
+		mesh = {
+			id = '6668682D6E6F7765',
+		},
+	},
+
+	wifi5 = {
+		ap = {
+			ssid = "hamburg.freifunk.net",
+		},
+		mesh = {
+			id = '6668682D6E6F7765',
+		},
+	},
+
+	mesh = {
+		vxlan = false,
+		batman_adv = {
+			routing_algo = "BATMAN_IV",
+		},
+	},
+
+	mesh_vpn = {
+		fastd = {
+			groups = {
+				backbone = {
+					peers = {
+						gateway01 = {
+							remotes = { '"gw01-new.hamburg.freifunk.net" port 10007' },
+							key = 'aa88fb5cc3e729c124589e3714b817a505d809f381d9b3494040c382edfd4f3b',
+						},
+						gateway02 = {
+							remotes = { '"gw02-new.hamburg.freifunk.net" port 10007' },
+							key = '462b4e21ab5eb0f9de687efd97252880c895ba55cc9cc0755a75347b0965b6e0',
+						},
+						gateway03 = {
+							remotes = { '"gw03-new.hamburg.freifunk.net" port 10007' },
+							key = 'e15295b86138ac490d611e4100f847ccfb7052d5091ded4659f25940be2c0546',
+						},
+						gateway04 = {
+							remotes = { '"gw04-new.hamburg.freifunk.net" port 10008' },
+							key = 'a00e092c236c3b56043fb3b5d0b3da3da08d8325fb18e7bae6ed035d50d50669',
+						},
+						gateway05 = {
+							remotes = { '"gw05-new.hamburg.freifunk.net" port 10008' },
+							key = '291197d88a5ed510a62fec87f30d13315c1e031c62c927c23e1643a72796708f',
+						},
+						gateway06 = {
+							remotes = { '"gw06-new.hamburg.freifunk.net" port 10008' },
+							key = '8d400e8a9db05b145c36583d46b4170f6b66d1e16177540f8a2f9f5ad0dc4c43',
+						},
+					},
+				},
+			},
+		},
+	},
+}
diff --git a/domains/ffhh_ost.conf b/domains/ffhh_ost.conf
new file mode 100644
index 0000000..941b75d
--- /dev/null
+++ b/domains/ffhh_ost.conf
@@ -0,0 +1,75 @@
+{
+	domain_names = {
+		ffhh_ost  = "Hamburg Ost",
+	},
+	domain_seed = '666668682D6F737448616D6275726748616D6275726748616D6275726748616D',
+
+	prefix4 = '10.112.224.0/19',
+	prefix6 = '2a03:2267:4::/64',
+
+	next_node = {
+		ip4 = '10.112.224.1',
+		ip6 = '2a03:2267:4::1',
+		mac = '16:41:95:40:f7:dc',
+	},
+
+	wifi24 = {
+		ap = {
+			ssid = "hamburg.freifunk.net",
+		},
+		mesh = {
+			id = '666668682D6F7374',
+		},
+	},
+
+	wifi5 = {
+		ap = {
+			ssid = "hamburg.freifunk.net",
+		},
+		mesh = {
+			id = '666668682D6F7374',
+		},
+	},
+
+	mesh = {
+		vxlan = false,
+		batman_adv = {
+			routing_algo = "BATMAN_IV",
+		},
+	},
+
+	mesh_vpn = {
+		fastd = {
+			groups = {
+				backbone = {
+					peers = {
+						gateway01 = {
+							remotes = { '"gw01-new.hamburg.freifunk.net" port 10009' },
+							key = 'aa88fb5cc3e729c124589e3714b817a505d809f381d9b3494040c382edfd4f3b',
+						},
+						gateway02 = {
+							remotes = { '"gw02-new.hamburg.freifunk.net" port 10009' },
+							key = '462b4e21ab5eb0f9de687efd97252880c895ba55cc9cc0755a75347b0965b6e0',
+						},
+						gateway03 = {
+							remotes = { '"gw03-new.hamburg.freifunk.net" port 10009' },
+							key = 'e15295b86138ac490d611e4100f847ccfb7052d5091ded4659f25940be2c0546',
+						},
+						gateway04 = {
+							remotes = { '"gw04-new.hamburg.freifunk.net" port 10010' },
+							key = 'a00e092c236c3b56043fb3b5d0b3da3da08d8325fb18e7bae6ed035d50d50669',
+						},
+						gateway05 = {
+							remotes = { '"gw05-new.hamburg.freifunk.net" port 10010' },
+							key = '291197d88a5ed510a62fec87f30d13315c1e031c62c927c23e1643a72796708f',
+						},
+						gateway06 = {
+							key = '8d400e8a9db05b145c36583d46b4170f6b66d1e16177540f8a2f9f5ad0dc4c43',
+							remotes = { '"gw06-new.hamburg.freifunk.net" port 10010' },
+						},
+					},
+				},
+			},
+		},
+	},
+}
diff --git a/domains/ffhh_sued.conf b/domains/ffhh_sued.conf
new file mode 100644
index 0000000..1a6f31f
--- /dev/null
+++ b/domains/ffhh_sued.conf
@@ -0,0 +1,75 @@
+{
+	domain_names = {
+		ffhh_sued = "Hamburg Süd",
+	},
+	domain_seed = '666668682D7375656448616D6275726748616D6275726748616D627572674861',
+
+	prefix4 = '10.112.64.0/19',
+	prefix6 = '2a03:2267:1::/64',
+
+	next_node = {
+		ip4 = '10.112.64.1',
+		ip6 = '2a03:2267:1::1',
+		mac = '16:41:95:40:f7:dc',
+	},
+
+	wifi24 = {
+		ap = {
+			ssid = "hamburg.freifunk.net",
+		},
+		mesh = {
+			id = '6668682D73756564',
+		},
+	},
+
+	wifi5 = {
+		ap = {
+			ssid = "hamburg.freifunk.net",
+		},
+		mesh = {
+			id = '6668682D73756564',
+		},
+	},
+
+	mesh = {
+		vxlan = false,
+		batman_adv = {
+			routing_algo = "BATMAN_IV",
+		},
+	},
+
+	mesh_vpn = {
+		fastd = {
+			groups = {
+				backbone = {
+					peers = {
+						gateway01 = {
+							remotes = { '"gw01-new.hamburg.freifunk.net" port 10003' },
+							key = 'aa88fb5cc3e729c124589e3714b817a505d809f381d9b3494040c382edfd4f3b',
+						},
+						gateway02 = {
+							key = '462b4e21ab5eb0f9de687efd97252880c895ba55cc9cc0755a75347b0965b6e0',
+							remotes = { '"gw02-new.hamburg.freifunk.net" port 10003' },
+						},
+						gateway03 = {
+							remotes = { '"gw03-new.hamburg.freifunk.net" port 10003' },
+							key = 'e15295b86138ac490d611e4100f847ccfb7052d5091ded4659f25940be2c0546',
+						},
+						gateway04 = {
+							remotes = { '"gw04-new.hamburg.freifunk.net" port 10004' },
+							key = 'a00e092c236c3b56043fb3b5d0b3da3da08d8325fb18e7bae6ed035d50d50669',
+						},
+						gateway05 = {
+							remotes = { '"gw05-new.hamburg.freifunk.net" port 10004' },
+							key = '291197d88a5ed510a62fec87f30d13315c1e031c62c927c23e1643a72796708f',
+						},
+						gateway06 = {
+							remotes = { '"gw06-new.hamburg.freifunk.net" port 10004' },
+							key = '8d400e8a9db05b145c36583d46b4170f6b66d1e16177540f8a2f9f5ad0dc4c43',
+						},
+					},
+				},
+			},
+		},
+	},
+}
diff --git a/domains/ffhh_west.conf b/domains/ffhh_west.conf
new file mode 100644
index 0000000..ca3c22a
--- /dev/null
+++ b/domains/ffhh_west.conf
@@ -0,0 +1,75 @@
+{
+	domain_names = {
+		ffhh_west = "Hamburg West",
+	},
+	domain_seed = '666668682D7765737448616D6275726748616D6275726748616D627572674861',
+
+	prefix4 = '10.112.96.0/19',
+	prefix6 = '2a03:2267:2::/64',
+
+	next_node = {
+		ip4 = '10.112.96.1',
+		ip6 = '2a03:2267:2::1',
+		mac = '16:41:95:40:f7:dc',
+	},
+
+	wifi24 = {
+		ap = {
+			ssid = "hamburg.freifunk.net",
+		},
+		mesh = {
+			id = '6668682D77657374',
+		},
+	},
+
+	wifi5 = {
+		ap = {
+			ssid = "hamburg.freifunk.net",
+		},
+		mesh = {
+			id = '6668682D77657374',
+		},
+	},
+
+	mesh = {
+		vxlan = false,
+		batman_adv = {
+			routing_algo = "BATMAN_IV",
+		},
+	},
+
+	mesh_vpn = {
+		fastd = {
+			groups = {
+				backbone = {
+					peers = {
+						gateway01 = {
+							remotes = { '"gw01-new.hamburg.freifunk.net" port 10005' },
+							key = 'aa88fb5cc3e729c124589e3714b817a505d809f381d9b3494040c382edfd4f3b',
+						},
+						gateway02 = {
+							key = '462b4e21ab5eb0f9de687efd97252880c895ba55cc9cc0755a75347b0965b6e0',
+							remotes = { '"gw02-new.hamburg.freifunk.net" port 10005' },
+						},
+						gateway03 = {
+							remotes = { '"gw03-new.hamburg.freifunk.net" port 10005' },
+							key = 'e15295b86138ac490d611e4100f847ccfb7052d5091ded4659f25940be2c0546',
+						},
+						gateway04 = {
+							remotes = { '"gw04-new.hamburg.freifunk.net" port 10006' },
+							key = 'a00e092c236c3b56043fb3b5d0b3da3da08d8325fb18e7bae6ed035d50d50669',
+						},
+						gateway05 = {
+							remotes = { '"gw05-new.hamburg.freifunk.net" port 10006' },
+							key = '291197d88a5ed510a62fec87f30d13315c1e031c62c927c23e1643a72796708f',
+						},
+						gateway06 = {
+							remotes = { '"gw06-new.hamburg.freifunk.net" port 10006' },
+							key = '8d400e8a9db05b145c36583d46b4170f6b66d1e16177540f8a2f9f5ad0dc4c43',
+						},
+					},
+				},
+			},
+		},
+	},
+}
diff --git a/i18n/de.po b/i18n/de.po
index f0bef46..58dfb28 100644
--- a/i18n/de.po
+++ b/i18n/de.po
@@ -16,16 +16,24 @@ msgstr ""
 "Freifunk-Knoten. Fülle das folgende Formular deinen Vorstellungen "
 "entsprechend aus und sende es ab. "
 "Den unten anzugebenden Knotennamen kannst du beliebig wählen. Denke Dir also etwas schönes aus. Er ist der Name des Knotens im Netzwerk und hat nichts mit dem ausgestrahlten Netzwerknamen (SSID) zu tun. Letzterer ist immer hamburg.freifunk.net."
+ 
+msgid "gluon-config-mode:domain"
+msgstr "Domäne" 
+
+msgid "gluon-config-mode:domain-select"
+msgstr ""
+"Hier kannst du Domäne auswählen, in dem sich dein Knoten befindet. "
+"Bitte bedenke, dass sich dein Knoten nur mit Routern in der gleichen Domäne verbinden kann."
 
 msgid "gluon-config-mode:pubkey"
 msgstr ""
 "<p>Dies ist der öffentliche Schlüssel deines Freifunkknotens. Erst nachdem "
 "er auf den Servern des Hamburger Freifunk-Projektes eingetragen wurde, "
 "kann sich dein Knoten mit dem Hamburger Mesh-VPN verbinden. "
-"Bitte trage dazu diesen Schlüssel, den Namen deines Knotens (<em><%=hostname%></em>) und ein paar andere Informationen unter "
-"<a href=\"https://formular.hamburg.freifunk.net/#/new?hostname=<%=hostname%>&key=<%=pubkey%>&mac=<%= sysconfig.primary_mac %>\" target=\"_blank\">https://formular.hamburg.freifunk.net/</a> ein.</p>"
+"Bitte trage dazu diesen Schlüssel, den Namen deines Knotens (<em><%=pcdata(hostname)%></em>) und ein paar andere Informationen unter "
+"<a href=\"https://formular.hamburg.freifunk.net/#/new?hostname=<%=pcdata(hostname)%>&amp;key=<%=pubkey%>&amp;mac=<%= sysconfig.primary_mac %>\" target=\"_blank\">https://formular.hamburg.freifunk.net/</a> ein.</p>"
 "<div class=\"the-key\">"
-" # <%= hostname %>"
+" # <%= pcdata(hostname) %>"
 " <br/>"
 "<%= pubkey %>"
 "</div>"
@@ -39,9 +47,9 @@ msgstr ""
 "<a href=\"https://hamburg.freifunk.net/\">unserer Webseite</a>.</p>"
 "<p>Viel Spaß mit deinem Knoten und der Erkundung von Freifunk!</p>"
 
-msgid "gluon-config-mode:nopubkey"
+msgid "gluon-config-mode:novpn"
 msgstr ""
 "Bitte trage nun den Namen deines Knotens "
-"(<em><%=hostname%></em>) und ein paar andere Informationen unter "
-"<a href=\"https://formular.hamburg.freifunk.net/#/new?hostname=<%=hostname%>&mac=<%= sysconfig.primary_mac %>\" target=\"_blank\">https://formular.hamburg.freifunk.net/</a> "
+"(<em><%=pcdata(hostname)%></em>) und ein paar andere Informationen unter "
+"<a href=\"https://formular.hamburg.freifunk.net/#/new?hostname=<%=pcdata(hostname)%>&amp;mac=<%= sysconfig.primary_mac %>\" target=\"_blank\">https://formular.hamburg.freifunk.net/</a> "
 "ein."
diff --git a/i18n/en.po b/i18n/en.po
index 2731910..f64501f 100644
--- a/i18n/en.po
+++ b/i18n/en.po
@@ -19,15 +19,24 @@ msgstr ""
 "the network and has nothing to do with the broadcast network name (SSID). "
 "The latter is always hamburg.freifunk.net."
 
+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 the public key for your Freifunk node. You can only "
 "connect the node to the Hamburg mesh VPN after the key has been registered on "
 "the Freifunk Hamburg servers. "
-"Please register your key, the name of your node (<em><%=hostname%></em>), and a bit of additional info at "
-"<a href=\"https://formular.hamburg.freifunk.net/#/new?hostname=<%=hostname%>&key=<%=pubkey%>&mac=<%= sysconfig.primary_mac %>\" target=\"_blank\">https://formular.hamburg.freifunk.net/</a>.</p>"
+"Please register your key, the name of your node (<em><%=pcdata(hostname)%></em>), and a bit of additional info at "
+"<a href=\"https://formular.hamburg.freifunk.net/#/new?hostname=<%=pcdata(hostname)%>&amp;key=<%=pubkey%>&amp;mac=<%= sysconfig.primary_mac %>\" target=\"_blank\">https://formular.hamburg.freifunk.net/</a>.</p>"
 "<div class=\"the-key\">"
-" # <%= hostname %>"
+" # <%= pcdata(hostname) %>"
 " <br/>"
 "<%= pubkey %>"
 "</div>"
@@ -40,9 +49,9 @@ msgstr ""
 "<a href=\"https://hamburg.freifunk.net/\">our homepage</a>.</p>"
 "<p>Have fun with your node and exploring the Freifunk network!</p>"
 
-msgid "gluon-config-mode:nopubkey"
+msgid "gluon-config-mode:novpn"
 msgstr ""
 "Please enter the name of your node "
 "(<em><%=hostname%></em>) and some additional information at "
-"<a href=\"https://formular.hamburg.freifunk.net/#/new?hostname=<%=hostname%>&mac=<%= sysconfig.primary_mac %>\" target=\"_blank\">https://formular.hamburg.freifunk.net/</a> "
+"<a href=\"https://formular.hamburg.freifunk.net/#/new?hostname=<%=pcdata(hostname)%>&amp;mac=<%= sysconfig.primary_mac %>\" target=\"_blank\">https://formular.hamburg.freifunk.net/</a> "
 "."
diff --git a/image-customization.lua b/image-customization.lua
new file mode 100644
index 0000000..79abeed
--- /dev/null
+++ b/image-customization.lua
@@ -0,0 +1,36 @@
+features({
+    'autoupdater',
+    'config-mode-domain-select',
+    'ebtables-filter-multicast',
+    'ebtables-filter-ra-dhcp',
+    'mesh-batman-adv-15',
+    'mesh-vpn-fastd',
+    'web-private-wifi',
+    'radv-filterd',
+    'respondd',
+    'status-page',
+    'web-advanced',
+    'web-wizard',
+})
+
+if not device_class('tiny') then
+    features({
+        'wireless-encryption-wpa3',
+    })
+end
+
+packages({
+    '-gluon-config-mode-geo-location',
+    '-gluon-config-mode-contact-info',
+    'gluon-ebtables-source-filter',
+    'gluon-web-mesh-vpn-fastd',
+    'iwinfo',
+})
+
+if target('x86') then
+    packages({
+        'nano',
+        'htop',
+        'ethtool',
+    })
+end
diff --git a/modules b/modules
index 6a1e244..d1b67ac 100644
--- a/modules
+++ b/modules
@@ -1,5 +1,5 @@
 GLUON_SITE_FEEDS='ffhh_packages'
 
-PACKAGES_FFHH_PACKAGES_REPO=git://github.com/freifunkhamburg/ffhh-packages.git
-PACKAGES_FFHH_PACKAGES_COMMIT=58a026ad0dbea4bd2727ce30a410bd9c6fdbaaa7
+PACKAGES_FFHH_PACKAGES_REPO=https://github.com/freifunkhamburg/ffhh-packages.git
+PACKAGES_FFHH_PACKAGES_COMMIT=ef9fcc1222f74c3c045b1450537a4b8b80efb56c
 
diff --git a/site.conf b/site.conf
index 4b89dfe..04919a0 100644
--- a/site.conf
+++ b/site.conf
@@ -1,150 +1,102 @@
 {
 	hostname_prefix = 'GibMirEinenNamen',
-	site_name = 'Freifunk Hamburg',
-	site_code = 'ffhh',
-
-	opkg = {
-		openwrt = 'http://opkg.services.ffhh/%n/%v/%S/packages',
-		extra = {
-			modules = 'http://updates.hamburg.freifunk.net/stable/archive/modules/gluon-%GS-%GR/%S',
+	config_mode = {
+		hostname = {
+			optional = false,
+			prefill = false,
 		},
 	},
 
-	prefix4 = '10.112.0.0/18',
-	prefix6 = '2a03:2267::/64',
+	site_name = 'Freifunk Hamburg',
+	site_code = 'ffhh',
+	default_domain = 'ffhh_nowe',
+
+	opkg = {
+		extra = {
+			modules = 'http://updates.hamburg.freifunk.net/multi/archive/%GR/packages/gluon-%GS-%GR/%S',
+		},
+	},
 
 	timezone = 'CET-1CEST,M3.5.0,M10.5.0/3', -- Europe/Berlin
-	ntp_servers = {'1.ntp.services.ffhh','2.ntp.services.ffhh'},
+	ntp_servers = {'1.ntp.services.ffhh','2.ntp.services.ffhh','3.ntp.services.ffhh'},
 	regdom = 'DE',
 
 	wifi24 = {
 		channel = 1,
-		ap = {
-			ssid = 'hamburg.freifunk.net',
-		},
-		ibss = {
-			ssid = 'f8:d1:11:87:52:2e',
-			bssid = 'f8:d1:11:87:52:2e',
+
+		mesh = {
 			mcast_rate = 12000,
 		},
-		--[[ mesh = {
-			id = 'ffhh-mesh',
-			mcast_rate = 12000,
-		}, --]]
 	},
 
 	wifi5 = {
 		channel = 44,
-		ap = {
-			ssid = 'hamburg.freifunk.net',
-		},
-		ibss = {
-			ssid = 'f8:d1:11:87:52:2e',
-			bssid = 'f8:d1:11:87:52:2e',
+		outdoor_chanlist = "100-140",
+		mesh = {
 			mcast_rate = 12000,
 		},
-		--[[ mesh = {
-			id = 'ffhh-mesh',
-			mcast_rate = 12000,
-		}, --]]
 	},
 
-	next_node = {
-		ip4 = '10.112.0.1',
-		ip6 = '2a03:2267::1',
-
-		mac = '16:41:95:40:f7:dc',
-	},
-
-	fastd_mesh_vpn = {
+	mesh_vpn = {
 		enabled = true,
-		methods = {'salsa2012+umac'},
-		mtu = 1280,
-		groups = {
-			backbone = {
-				limit = 1,
-				peers = {
-					gateway01 = {
-						key = 'cb09c68e2d2f7d374d47035cd532e0a60b8b3a7447aa5a7f76f4f15c8ffa9e58',
-						remotes = {'"gw01.hamburg.freifunk.net" port 10001'},
-					},
-					gateway02 = {
-						key = '462b4e21ab5eb0f9de687efd97252880c895ba55cc9cc0755a75347b0965b6e0',
-						remotes = {'"gw02.hamburg.freifunk.net" port 10001'},
-					},
-					gateway03 = {
-						key = 'e15295b86138ac490d611e4100f847ccfb7052d5091ded4659f25940be2c0546',
-						remotes = {'"gw03.hamburg.freifunk.net" port 10001'},
-					},
-					gateway04 = {
-						key = 'fca88dd58316f4ab50d2a697123dddf4d0ba3aad52ddeb0ba7835cdbbeb60dbf',
-						remotes = {'"gw04.hamburg.freifunk.net" port 10000'},
-					},
-					gateway05 = {
-						key = '84986658775167dff6918dc8e0529c4a4524cb1782849a80933ddb6d8c6bd3f5',
-						remotes = {'"gw05.hamburg.freifunk.net" port 10001'},
-					},
-					gateway06 = {
-						key = 'fb608aa75180ba88b4a3399a6498e68796d200afc1bfd275a0dcb903a31f39b6',
-						remotes = {'"gw06.hamburg.freifunk.net" port 10000'},
-					},
-						gateway08 = {
-						key = '67e9b215248ada3f4ffcc9db0bdf897128f6236a0d4e8d660762b77bebc914d4',
-						remotes = {'"gw08.hamburg.freifunk.net" port 10001'},
-					},
-					gateway09 = {
-						key = '5f483f6d26ac9106d86c0edcd08cf92c18caf67933719a394915ab809d1fb2bc',
-						remotes = {'"gw09.hamburg.freifunk.net" port 10001'},
-					},
-					gateway12 = {
-						key = 'facbbfb07525782fcde22b929f36ea508a295619eca35782003d9ca2dd3cc524',
-						remotes = {'"gw12.hamburg.freifunk.net" port 10001'},
-					},
+		fastd = {
+			configurable = true,
+			mtu = 1312,
+			methods = {'salsa2012+umac'},
+			groups = {
+				backbone = {
+					limit = 1,
 				},
 			},
 		},
 		bandwidth_limit = {
 			enabled = false,
-			ingress = 8000,
-			egress = 500,
+			ingress = 8096,
+			egress = 1024,
 		},
 	},
 
 	autoupdater = {
-		branch = 'experimental',
+		branch = 'stable',
 		branches = {
 			stable = {
 				name = 'stable',
-				mirrors = {'http://1.updates.services.ffhh/stable/sysupgrade','http://2.updates.services.ffhh/stable/sysupgrade'},
+				mirrors = {'http://updates-a.hamburg.freifunk.net/multi/stable/images/sysupgrade','http://updates-b.hamburg.freifunk.net/multi/stable/images/sysupgrade'},
 				good_signatures = 2,
 				pubkeys = {
-					'417ef22f886539ddbcffbad35e9f493195ca53e05f75bd8d8011a4999498b589', -- baldo
 					'ef73bc52b929fd11efce9a5c8f0b5463f1766bb995c8a0b3b6bcd7ba45b8b1e6', -- leo
 					'3f0fc50d4e5c893f9f58f98874bd21080b93c28ff5e4d4946352cada1b4e6441', -- andre
 					'1d37eacbd70f72730b1f5aba246a6a8eab100e2d45dda0163d9ad827f70f88d4', -- gernot
 					'bd5a70d4c3df30eaa860d615c0e0526b0dda5bc60c09c20972bce4ffa7512659', -- bjoern
+					'd9992853c0fe1a2e983cc222b6bd26e70d4fb2a53862ac099144e9e8142238d0', -- daniel
+					'961495a04512e5ba1843fd3c216d8af6ef2fdb19f93055142803e2da26d670b9', -- alexander
+					'ed6278f168f0382adf4f058cb9c31d8f1145abb968a8626045de7d6d87a0be40', -- olli
 				},
 			},
 			beta = {
 				name = 'beta',
-				mirrors = {'http://1.updates.services.ffhh/beta/sysupgrade','http://2.updates.services.ffhh/beta/sysupgrade'},
+				mirrors = {'http://updates-a.hamburg.freifunk.net/multi/stable/images/sysupgrade','http://updates-b.hamburg.freifunk.net/multi/stable/images/sysupgrade'},
 				good_signatures = 2,
 				pubkeys = {
-					'417ef22f886539ddbcffbad35e9f493195ca53e05f75bd8d8011a4999498b589', -- baldo
 					'ef73bc52b929fd11efce9a5c8f0b5463f1766bb995c8a0b3b6bcd7ba45b8b1e6', -- leo
 					'3f0fc50d4e5c893f9f58f98874bd21080b93c28ff5e4d4946352cada1b4e6441', -- andre
 					'1d37eacbd70f72730b1f5aba246a6a8eab100e2d45dda0163d9ad827f70f88d4', -- gernot
 					'bd5a70d4c3df30eaa860d615c0e0526b0dda5bc60c09c20972bce4ffa7512659', -- bjoern
+					'd9992853c0fe1a2e983cc222b6bd26e70d4fb2a53862ac099144e9e8142238d0', -- daniel
+					'961495a04512e5ba1843fd3c216d8af6ef2fdb19f93055142803e2da26d670b9', -- alexander
+					'ed6278f168f0382adf4f058cb9c31d8f1145abb968a8626045de7d6d87a0be40', -- olli
 				},
 			},
 			experimental = {
 				name = 'experimental',
-				mirrors = {'http://1.updates.services.ffhh/experimental/sysupgrade','http://2.updates.services.ffhh/experimental/sysupgrade'},
+				mirrors = {'http://updates-a.hamburg.freifunk.net/multi/experimental/images/sysupgrade','http://updates-b.hamburg.freifunk.net/multi/experimental/images/sysupgrade'},
 				good_signatures = 1,
 				pubkeys = {
-					'1a0112fe489860068480c611c5dc56196c2f1a645db651ea2ed19ae0f0e8e1d1', -- 1.builder
+					'1a0112fe489860068480c611c5dc56196c2f1a645db651ea2ed19ae0f0e8e1d1', -- builder1/2
 				},
 			},
 		},
 	},
+
+	poe_passthrough = false,
 }
diff --git a/site.mk b/site.mk
index bda5e1e..45aa428 100644
--- a/site.mk
+++ b/site.mk
@@ -1,35 +1,11 @@
-GLUON_SITE_PACKAGES := \
-	gluon-mesh-batman-adv-14 \
-	gluon-alfred \
-	gluon-autoupdater \
-	gluon-config-mode-autoupdater \
-	gluon-config-mode-core \
-	gluon-config-mode-hostname \
-	gluon-config-mode-mesh-vpn \
-	gluon-config-mode-reboot-ffhh \
-	gluon-ebtables-filter-multicast \
-	gluon-ebtables-filter-ra-dhcp \
-	gluon-luci-admin \
-	gluon-luci-autoupdater \
-	gluon-luci-portconfig \
-	gluon-luci-private-wifi \
-	gluon-next-node \
-	gluon-mesh-vpn-fastd \
-	gluon-radvd \
-	gluon-respondd \
-	gluon-setup-mode \
-	gluon-status-page \
-	fastd-traffic-status \
-	iwinfo \
-	iptables \
-	haveged
+GLUON_MULTIDOMAIN := 1
+GLUON_DEPRECATED := upgrade
 
+GLUON_AUTOUPDATER_ENABLED ?= 1
 
-DEFAULT_GLUON_RELEASE := 0.8
+GLUON_PRIORITY ?= 7
 
-# Allow overriding the release number from the command line
-GLUON_RELEASE ?= $(DEFAULT_GLUON_RELEASE)
-
-GLUON_PRIORITY ?= 0
+# Region code required for some images; supported values: us eu
+GLUON_REGION ?= eu
 
 GLUON_LANGS ?= en de