diff --git a/package/gluon-autoupdater/Makefile b/package/gluon-autoupdater/Makefile
index a93f83f53a0752d9ff399973b7db7c2f064a4bd9..a885a0d0f623951ba5accc3367d2c87c3385de06 100644
--- a/package/gluon-autoupdater/Makefile
+++ b/package/gluon-autoupdater/Makefile
@@ -1,12 +1,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=gluon-autoupdater
-PKG_VERSION:=2
+PKG_VERSION:=3
 PKG_RELEASE:=$(GLUON_BRANCH)
 
 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
 
-include $(INCLUDE_DIR)/package.mk
+include $(GLUONDIR)/include/package.mk
 
 define Package/gluon-autoupdater
   SECTION:=gluon
@@ -34,4 +34,9 @@ define Package/gluon-autoupdater/install
 	fi
 endef
 
+define Package/gluon-autoupdater/postinst
+#!/bin/sh
+$(call GluonCheckSite,check_site.lua)
+endef
+
 $(eval $(call BuildPackage,gluon-autoupdater))
diff --git a/package/gluon-autoupdater/check_site.lua b/package/gluon-autoupdater/check_site.lua
new file mode 100644
index 0000000000000000000000000000000000000000..4d6302cd07286da2a1088e7b7b0139c20276565f
--- /dev/null
+++ b/package/gluon-autoupdater/check_site.lua
@@ -0,0 +1,13 @@
+need_string 'autoupdater.branch'
+
+local function check_branch(k, _)
+   local prefix = string.format('autoupdater.branches[%q].', k)
+
+   need_string(prefix .. 'name')
+   need_string_array(prefix .. 'mirrors')
+   need_number(prefix .. 'probability')
+   need_number(prefix .. 'good_signatures')
+   need_string_array(prefix .. 'pubkeys')
+end
+
+need_table('autoupdater.branches', check_branch)
diff --git a/package/gluon-config-mode/Makefile b/package/gluon-config-mode/Makefile
index 9a28d0279d7a6e2a8adc5d50b4d783b637ebcbf1..2d045b1719ee8034a2c59136b9eb127d6da42646 100644
--- a/package/gluon-config-mode/Makefile
+++ b/package/gluon-config-mode/Makefile
@@ -4,11 +4,11 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=gluon-config-mode
-PKG_VERSION:=2
+PKG_VERSION:=3
 
 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
 
-include $(INCLUDE_DIR)/package.mk
+include $(GLUONDIR)/include/package.mk
 
 define Package/gluon-config-mode
   SECTION:=gluon
@@ -35,4 +35,9 @@ define Package/gluon-config-mode/install
 	$(CP) ./files/* $(1)/
 endef
 
+define Package/gluon-config-mode/postinst
+#!/bin/sh
+$(call GluonCheckSite,check_site.lua)
+endef
+
 $(eval $(call BuildPackage,gluon-config-mode))
diff --git a/package/gluon-config-mode/check_site.lua b/package/gluon-config-mode/check_site.lua
new file mode 100644
index 0000000000000000000000000000000000000000..4892ceb313bd28da27e1f5b4ce69f0d987bbc08d
--- /dev/null
+++ b/package/gluon-config-mode/check_site.lua
@@ -0,0 +1,3 @@
+need_string 'config_mode.msg_welcome'
+need_string 'config_mode.msg_pubkey'
+need_string 'config_mode.msg_reboot'
diff --git a/package/gluon-core/Makefile b/package/gluon-core/Makefile
index 1282de362afc1120e402d2b66f48c70ab1e637db..5dbaee009f782c7fe44a165697450db4f89e42ca 100644
--- a/package/gluon-core/Makefile
+++ b/package/gluon-core/Makefile
@@ -1,12 +1,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=gluon-core
-PKG_VERSION:=2
+PKG_VERSION:=3
 PKG_RELEASE:=$(GLUON_VERSION)
 
 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
 
-include $(INCLUDE_DIR)/package.mk
+include $(GLUONDIR)/include/package.mk
 
 define Package/gluon-core
   SECTION:=gluon
@@ -36,4 +36,9 @@ define Package/gluon-core/install
 	echo "$(GLUON_VERSION)" > $(1)/lib/gluon/gluon-version
 endef
 
+define Package/gluon-core/postinst
+#!/bin/sh
+$(call GluonCheckSite,check_site.lua)
+endef
+
 $(eval $(call BuildPackage,gluon-core))
diff --git a/package/gluon-core/check_site.lua b/package/gluon-core/check_site.lua
new file mode 100644
index 0000000000000000000000000000000000000000..67035c0e9fad63b09483872e8d9d8ae942c036f6
--- /dev/null
+++ b/package/gluon-core/check_site.lua
@@ -0,0 +1,10 @@
+need_string 'site_code'
+need_string 'site_name'
+
+need_string 'hostname_prefix'
+need_string 'timezone'
+
+need_string_array('ntp_servers', false)
+
+need_string_match('prefix4', '^%d+.%d+.%d+.%d+/%d+$')
+need_string_match('prefix6', '^[%x:]+/%d+$')
diff --git a/package/gluon-legacy/Makefile b/package/gluon-legacy/Makefile
index d074f6998047e42d8f22a0a8f999f2bf1ecaf77e..7320fba6384e6eaad1be7972154a908d6b098d9e 100644
--- a/package/gluon-legacy/Makefile
+++ b/package/gluon-legacy/Makefile
@@ -1,11 +1,11 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=gluon-legacy
-PKG_VERSION:=1
+PKG_VERSION:=2
 
 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
 
-include $(INCLUDE_DIR)/package.mk
+include $(GLUONDIR)/include/package.mk
 
 define Package/gluon-legacy
   SECTION:=gluon
@@ -32,4 +32,9 @@ define Package/gluon-legacy/install
 	$(CP) ./files/* $(1)/
 endef
 
+define Package/gluon-legacy/postinst
+#!/bin/sh
+$(call GluonCheckSite,check_site.lua)
+endef
+
 $(eval $(call BuildPackage,gluon-legacy))
diff --git a/package/gluon-legacy/check_site.lua b/package/gluon-legacy/check_site.lua
new file mode 100644
index 0000000000000000000000000000000000000000..1ec26de07a904396202721a74755aab8c5410e53
--- /dev/null
+++ b/package/gluon-legacy/check_site.lua
@@ -0,0 +1,8 @@
+need_string_array 'legacy.version_files'
+need_string_array 'legacy.old_files'
+
+need_string_array 'legacy.config_mode_configs'
+need_string_array 'legacy.fastd_configs'
+need_string 'legacy.mesh_ifname'
+need_string_array 'legacy.tc_configs'
+need_string_array 'legacy.wifi_names'
diff --git a/package/gluon-mesh-batman-adv/Makefile b/package/gluon-mesh-batman-adv/Makefile
index bc545baf9b01aa6093cc2ef4c99745920eb9d536..5daf5e524bbb72cec863be8a0abcd086e1ded8c9 100644
--- a/package/gluon-mesh-batman-adv/Makefile
+++ b/package/gluon-mesh-batman-adv/Makefile
@@ -1,11 +1,11 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=gluon-mesh-batman-adv
-PKG_VERSION:=2
+PKG_VERSION:=3
 
 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
 
-include $(INCLUDE_DIR)/package.mk
+include $(GLUONDIR)/include/package.mk
 
 define Package/gluon-mesh-batman-adv
   SECTION:=gluon
@@ -32,4 +32,10 @@ define Package/gluon-mesh-batman-adv/install
 	$(CP) ./files/* $(1)/
 endef
 
+define Package/gluon-mesh-batman-adv/postinst
+#!/bin/sh
+$(call GluonCheckSite,check_site.lua)
+endef
+
+
 $(eval $(call BuildPackage,gluon-mesh-batman-adv))
diff --git a/package/gluon-mesh-batman-adv/check_site.lua b/package/gluon-mesh-batman-adv/check_site.lua
new file mode 100644
index 0000000000000000000000000000000000000000..36619564959b2d7bf0ffea11dbf18a0e900d732a
--- /dev/null
+++ b/package/gluon-mesh-batman-adv/check_site.lua
@@ -0,0 +1,10 @@
+need_string('regdom')
+
+for _, config in ipairs({'wifi24', 'wifi5'}) do
+   need_string(config .. '.ssid')
+   need_number(config .. '.channel')
+   need_string(config .. '.htmode')
+   need_string(config .. '.mesh_ssid')
+   need_string_match(config .. '.mesh_bssid', '^%x[02468aAcCeE]:%x%x:%x%x:%x%x:%x%x:%x%x$')
+   need_number(config .. '.mesh_mcast_rate')
+end
diff --git a/package/gluon-mesh-vpn-fastd/Makefile b/package/gluon-mesh-vpn-fastd/Makefile
index 3531b3b153724f68a11e3d5ecfd2e4847b064c46..9290b45703eb97cf1507a5ba1c1da1b3f57bd6ae 100644
--- a/package/gluon-mesh-vpn-fastd/Makefile
+++ b/package/gluon-mesh-vpn-fastd/Makefile
@@ -1,11 +1,11 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=gluon-mesh-vpn-fastd
-PKG_VERSION:=2
+PKG_VERSION:=3
 
 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
 
-include $(INCLUDE_DIR)/package.mk
+include $(GLUONDIR)/include/package.mk
 
 define Package/gluon-mesh-vpn-fastd
   SECTION:=gluon
@@ -32,4 +32,9 @@ define Package/gluon-mesh-vpn-fastd/install
 	$(CP) ./files/* $(1)/
 endef
 
+define Package/gluon-mesh-vpn-fastd/postinst
+#!/bin/sh
+$(call GluonCheckSite,check_site.lua)
+endef
+
 $(eval $(call BuildPackage,gluon-mesh-vpn-fastd))
diff --git a/package/gluon-mesh-vpn-fastd/check_site.lua b/package/gluon-mesh-vpn-fastd/check_site.lua
new file mode 100644
index 0000000000000000000000000000000000000000..6c817137bf0e4f5ba350eb403350e9c89cc31956
--- /dev/null
+++ b/package/gluon-mesh-vpn-fastd/check_site.lua
@@ -0,0 +1,13 @@
+need_string_array 'fastd_mesh_vpn.methods'
+need_number 'fastd_mesh_vpn.mtu'
+need_number 'fastd_mesh_vpn.backbone.limit'
+
+
+local function check_peer(k, _)
+   local prefix = string.format('fastd_mesh_vpn.backbone.peers[%q].', k)
+
+   need_string(prefix .. 'key')
+   need_string_array(prefix .. 'remotes')
+end
+
+need_table('fastd_mesh_vpn.backbone.peers', check_peer)
diff --git a/package/gluon-next-node/Makefile b/package/gluon-next-node/Makefile
index ee0e0920ae8c399774055ed2e69d776cab6b91fd..f906bbd591b41b1c60adcd319fe06294eb082c65 100644
--- a/package/gluon-next-node/Makefile
+++ b/package/gluon-next-node/Makefile
@@ -1,11 +1,11 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=gluon-next-node
-PKG_VERSION:=2
+PKG_VERSION:=3
 
 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
 
-include $(INCLUDE_DIR)/package.mk
+include $(GLUONDIR)/include/package.mk
 
 define Package/gluon-next-node
   SECTION:=gluon
@@ -32,4 +32,9 @@ define Package/gluon-next-node/install
 	$(CP) ./files/* $(1)/
 endef
 
+define Package/gluon-next-node/postinst
+#!/bin/sh
+$(call GluonCheckSite,check_site.lua)
+endef
+
 $(eval $(call BuildPackage,gluon-next-node))
diff --git a/package/gluon-next-node/check_site.lua b/package/gluon-next-node/check_site.lua
new file mode 100644
index 0000000000000000000000000000000000000000..83889a8e2ab4b180100dc5f221b0f7d863e65254
--- /dev/null
+++ b/package/gluon-next-node/check_site.lua
@@ -0,0 +1,4 @@
+need_string_match('next_node.ip4', '^%d+.%d+.%d+.%d+$')
+need_string_match('next_node.ip6', '^[%x:]+$')
+
+need_string_match('next_node.mac', '^%x[02468aAcCeE]:%x%x:%x%x:%x%x:%x%x:%x%x$')