diff --git a/README.md b/README.md
index 5f1ea19..d9e669a 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
 
 	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://github.com/freifunkhamburg/site-ffhh.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:
@@ -15,6 +15,9 @@ Please see [the official Gluon repository](https://github.com/freifunk-gluon/glu
 
 #### 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)
diff --git a/build.conf b/build.conf
index 7c44063..07358e1 100644
--- a/build.conf
+++ b/build.conf
@@ -1,5 +1,5 @@
-GLUON_RELEASE="v2023.1.2.0"
-targets="ath79-generic ath79-nand ath79-mikrotik bcm27xx-bcm2708 bcm27xx-bcm2709 ipq40xx-generic ipq40xx-mikrotik ipq806x-generic lantiq-xrx200 lantiq-xway mediatek-mt7622 mpc85xx-p1010 mpc85xx-p1020 ramips-mt7620 ramips-mt7621 ramips-mt76x8 rockchip-armv8 sunxi-cortexa7 x86-generic x86-geode x86-legacy x86-64"
+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
index ac09d08..5647ba5 100755
--- a/build.sh
+++ b/build.sh
@@ -79,7 +79,7 @@ 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$(date +%Y%m%d)"
+[ "${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}"
@@ -91,7 +91,6 @@ env | egrep '^GLUON' | sort
 
 pushd "${gluon_path}"
 announce Starting make update...
-rm -rf "${GLUON_OUTPUTDIR}"
 mkdir -p "${GLUON_OUTPUTDIR}"
 make update
 # Try to install patches. I wasn't able to figure out how patches in gluon/site/patches work.
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/site.mk b/site.mk
index 419cb23..45aa428 100644
--- a/site.mk
+++ b/site.mk
@@ -3,35 +3,6 @@ GLUON_DEPRECATED := upgrade
 
 GLUON_AUTOUPDATER_ENABLED ?= 1
 
-GLUON_SITE_PACKAGES := \
-	-gluon-config-mode-geo-location \
-	-gluon-config-mode-contact-info \
-	gluon-ebtables-source-filter \
-	gluon-web-mesh-vpn-fastd \
-	iwinfo
-
-GLUON_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
-
-# x86 and x86-64 add extra software
-ifeq ($(GLUON_TARGET),$(filter $(GLUON_TARGET),x86-generic x86-64))
-	GLUON_SITE_PACKAGES += \
-		nano \
-		htop \
-		ethtool
-endif
-
 GLUON_PRIORITY ?= 7
 
 # Region code required for some images; supported values: us eu