diff --git a/README b/README
index fa6dfc3238195bb15f28fffda9ca9fa21563fdac..109bd1adcd4eba9ca9359d2c22895403961c9ad5 100644
--- a/README
+++ b/README
@@ -1,14 +1,22 @@
-Doku: https://gluon.readthedocs.org/en/latest/
+# Validation
+
+You can validate your changes to this repository by calling the validate_site.sh file with
+
+    tests/validate_site.sh
+
+# Dokumetation
+
+https://gluon.readthedocs.org/en/latest/
 
 Gluon Version auf der die Freifunk Nord Firmware basiert:
 
 * 2017.1.1 - Gluon LEDE 2017.1.1
 
-Download der Firmware:
+# Download der Firmware
 
 * https://nord.freifunk.net/firmware.html
 
-Firmware selber bauen:
+# Firmware selber bauen
 
 1. Vorbereitung:
 1.1 Abhängigkeiten installieren
@@ -37,7 +45,7 @@ Firmware selber bauen:
 	make -j8 GLUON_TARGET=ar71xx-generic ##-j $ZAHL$ = Anzahl der CPU Kerne
 
 
-Mögliche Targets:
+## Mögliche Targets
 
 ar71xx-generic
 ar71xx-mikrotik
@@ -48,7 +56,7 @@ x86-64
 x86-generic
 x86-geode
 
-# Nur mit 802.11s:
+## Nur mit 802.11s
 
 brcm2708-bcm2708
 brcm2708-bcm2709
diff --git a/tests/validate_site.sh b/tests/validate_site.sh
old mode 100644
new mode 100755
index 71352c8f23236095c2fdab3e21d84a8a0b40427f..d7334dfcbfa5e19c1d0cf2ef800475c681ea744a
--- a/tests/validate_site.sh
+++ b/tests/validate_site.sh
@@ -1,6 +1,70 @@
 #!/bin/bash
 
 # validate_site.sh checks if the site.conf is valid json
+GLUON_BRANCH='v2017.1.1'
 
+P=$(pwd)
+echo "####### validating $P/site.conf ..."
 GLUON_SITEDIR="." lua5.1 tests/site_config.lua
-bash -n make-release.sh
+
+echo "####### validating $P/make-release.sh ..."
+bash -n $P/make-release.sh 
+
+echo "####### validating $P/modules ..."
+source $P/modules
+testpath=/tmp/site-validate
+rm -Rf $testpath
+mkdir -p $testpath/packages
+cd $testpath/packages
+for feed in $GLUON_SITE_FEEDS; do
+  echo "checking PACKAGES_${feed^^}_REPO ..."
+  repo_var=$(echo PACKAGES_${feed^^}_REPO)
+  commit_var=$(echo PACKAGES_${feed^^}_COMMIT)
+  branch_var=$(echo PACKAGES_${feed^^}_BRANCH)
+  repo=${!repo_var}
+  commit=${!commit_var}
+  branch=${!branch_var}
+  if [ "$repo" == "" ]; then
+    echo "repo $repo_var missing"
+    exit 1
+  fi
+  if [ "$commit" == "" ]; then
+    echo "commit $commit_var missing"
+    exit 1
+  fi
+	if [ "$branch" == "" ]; then
+    echo "branch $branch_var missing"
+    exit 1
+  fi
+  git clone -b "$branch" --single-branch "$repo" $feed
+  if [ "$?" != "0" ]; then exit 1; fi
+  cd $feed
+  git checkout "$commit"
+  if [ "$?" != "0" ]; then exit 1; fi
+  cd -
+done
+cd $testpath
+git init gluon
+cd gluon
+git remote add origin https://github.com/freifunk-gluon/gluon
+git config core.sparsecheckout true
+echo "package/*" >> .git/info/sparse-checkout
+git pull --depth=1 origin $GLUON_BRANCH
+cp -a package/ $testpath/packages
+cd $testpath/packages/package
+
+echo "####### validating GLUON_SITE_PACKAGES from $P/site.mk ..."
+# ignore standard packages:
+sed '/GLUON_RELEASE/,$d' $P/site.mk | egrep -v '(#|G|iwinfo|iptables|haveged)'> $testpath/site.mk.sh
+sed -i 's/\s\\$//g;/^$/d' $testpath/site.mk.sh
+sed -i 's/gluon-mesh-batman-adv-1[45]/gluon-mesh-batman-adv/g' $testpath/site.mk.sh
+cat $testpath/site.mk.sh |
+while read packet; do
+  echo "check $packet ..."
+  if [ "$(find $testpath/packages/ -type d -name "$packet")" '!=' '' ]; then
+    : find found something
+  else
+    echo "ERROR: $packet missing"
+    exit 1
+  fi
+done