diff --git a/dist/tools/buildsystem_sanity_check/check.sh b/dist/tools/buildsystem_sanity_check/check.sh
new file mode 100755
index 0000000000000000000000000000000000000000..98758ec754f0061e5a76c1b11d8726d0d45ab69b
--- /dev/null
+++ b/dist/tools/buildsystem_sanity_check/check.sh
@@ -0,0 +1,62 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2018 Gaƫtan Harter <gaetan.harter@fu-berlin.de>
+#
+# This file is subject to the terms and conditions of the GNU Lesser
+# General Public License v2.1. See the file LICENSE in the top level
+# directory for more details.
+#
+
+#
+# Central test script to have sanity checks for the build system
+# It is run unconditionally on all files.
+#
+#
+
+: "${RIOTBASE:="$(cd "$(dirname "$0")/../../../" || exit; pwd)"}"
+
+SCRIPT_PATH=dist/tools/buildsystem_sanity_check/check.sh
+
+# Modules should not check the content of FEATURES_PROVIDED/_REQUIRED/OPTIONAL
+# Handling specific behaviors/dependencies should by checking the content of:
+# * `USEMODULE`
+# * maybe `FEATURES_USED` if it is not a module (== not a periph_)
+check_not_parsing_features() {
+    local patterns=()
+    local pathspec=()
+
+    patterns+=(-e 'if.*filter.*FEATURES_PROVIDED')
+    patterns+=(-e 'if.*filter.*FEATURES_REQUIRED')
+    patterns+=(-e 'if.*filter.*FEATURES_OPTIONAL')
+
+    # Pathspec with exclude should start by an inclusive pathspec in git 2.7.4
+    pathspec+=('*')
+
+    # Ignore this file when matching as it self matches
+    pathspec+=(":!${SCRIPT_PATH}")
+
+    # These two files contain sanity checks using FEATURES_ so are allowed
+    pathspec+=(':!Makefile.include' ':!makefiles/info-global.inc.mk')
+
+    git -C "${RIOTBASE}" grep "${patterns[@]}" -- "${pathspec[@]}"
+}
+
+
+main() {
+    local errors=''
+
+    errors+="$(check_not_parsing_features)"
+
+    if [ -n "${errors}" ]
+    then
+        printf 'Invalid build system patterns found by %s:\n' "${0}"
+        printf '%s\n' "${errors}"
+        exit 1
+    fi
+    exit 0
+}
+
+
+if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
+    main
+fi