diff --git a/Makefile b/Makefile
index c2510fb18a11f8fe080983d3fd80523f441d735c..890f740ac536991e9fa469c5f67e5da84f6a3e36 100644
--- a/Makefile
+++ b/Makefile
@@ -36,3 +36,5 @@ welcome:
 	@echo "    https://github.com/RIOT-OS/RIOT/wiki/Quick-Start-Guide"
 	@echo "Or ask questions on our mailing list:"
 	@echo "    users@riot-os.org (http://lists.riot-os.org/mailman/listinfo/users)"
+
+-include Makefile.tests
diff --git a/Makefile.tests b/Makefile.tests
new file mode 100644
index 0000000000000000000000000000000000000000..fd5e492ce6b01ce59dd82ddcc932bd31360b3055
--- /dev/null
+++ b/Makefile.tests
@@ -0,0 +1,3 @@
+
+static-test:
+	./dist/tools/static-tests.sh
diff --git a/dist/tools/static-tests.sh b/dist/tools/static-tests.sh
new file mode 100755
index 0000000000000000000000000000000000000000..d04c197637bcfc393f6aca17bdc96fab36f148df
--- /dev/null
+++ b/dist/tools/static-tests.sh
@@ -0,0 +1,45 @@
+#!/bin/bash
+#
+# Copyright (C) 2015 Lucas Jenß <lucas@x3ro.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.
+#
+
+# Change to RIOT root
+cd "$(dirname "$0")/../../"
+
+function dep {
+    which $1 2>&1 1>/dev/null
+    if (( $? != 0 )); then
+        echo "Dependency not met: $1"
+        exit 1
+    fi
+}
+
+function abort {
+    echo "$(tput setaf 1)$1$(tput sgr0)"
+    exit 1
+}
+
+function request_confirmation {
+    read -p "$(tput setaf 4)$1 (y/n) $(tput sgr0)"
+    [ "$REPLY" == "y" ] || abort "Aborted!"
+}
+
+# Make sure all required commands are available
+dep cppcheck
+dep pcregrep
+
+RIOT_REMOTE_COUNT="$(git remote | grep "^riot$" | wc -l)"
+if (( "$RIOT_REMOTE_COUNT" != 1 )); then
+    echo "The static test setup expect a remote called 'riot', pointing to the"
+    echo "central repository. This remote currently does not exist."
+    request_confirmation "Do you wish to create it?"
+
+    git remote add riot https://github.com/RIOT-OS/RIOT.git
+    git fetch riot
+fi
+
+BUILDTEST_MCU_GROUP=static-tests ./dist/tools/travis-scripts/build_and_test.sh
diff --git a/dist/tools/travis-scripts/build_and_test.sh b/dist/tools/travis-scripts/build_and_test.sh
index 49fac0312bdbf5575e658640e37c02ed91441c1d..d786175662626efae2aa996b68288bc2cc7e90b7 100755
--- a/dist/tools/travis-scripts/build_and_test.sh
+++ b/dist/tools/travis-scripts/build_and_test.sh
@@ -9,6 +9,45 @@
 
 CI_BASE_BRANCH=${CI_BASE_BRANCH:-master}
 
+function print_result {
+    local RED="\033[0;31m"
+    local GREEN="\033[0;32m"
+    local NO_COLOUR="\033[0m"
+
+    if (( "$1" == 0 )); then
+        echo -e "${GREEN}✓$NO_COLOUR"
+    else
+        echo -e "${RED}x$NO_COLOUR"
+    fi
+}
+
+RESULT=0
+set_result() {
+    NEW_RESULT=$1
+
+    if (( $NEW_RESULT != 0))
+    then
+        RESULT=$NEW_RESULT
+    fi
+}
+
+function run {
+    echo -n "Running '$@' "
+    OUT=$($@ 2>&1)
+    NEW_RESULT=$?
+
+    print_result $NEW_RESULT
+    set_result $NEW_RESULT
+
+    # Indent command output so that its easily discernable from the rest
+    OUT_LENGTH="$(echo -n $OUT | wc -c)"
+    if (( "$OUT_LENGTH" > 0 )); then
+        echo -e "Command output:\n"
+        (echo $OUT | while read -r line; do echo -ne "\t"; echo $line; done)
+        echo ""
+    fi
+}
+
 if [[ $BUILDTEST_MCU_GROUP ]]
 then
 
@@ -43,31 +82,30 @@ then
 
         trap "RESULT=1" ERR
 
-        git rebase ${CI_BASE_BRANCH} || git rebase --abort
+        git rebase ${CI_BASE_BRANCH}
+        if (( $? != 0 )); then
+            git rebase --abort > /dev/null 2>&1
+            echo "Rebase failed, aborting..."
+            exit 1
+        fi
+
         if [ $RESULT -ne 0 ]; then
             exit $RESULT
         fi
 
-        ./dist/tools/whitespacecheck/check.sh ${CI_BASE_BRANCH}
-
-        ./dist/tools/licenses/check.sh ${CI_BASE_BRANCH} --diff-filter=MR --error-exitcode=0
-
-        ./dist/tools/licenses/check.sh ${CI_BASE_BRANCH} --diff-filter=AC
-
-        ./dist/tools/doccheck/check.sh ${CI_BASE_BRANCH}
-
-        ./dist/tools/externc/check.sh ${CI_BASE_BRANCH}
+        run ./dist/tools/whitespacecheck/check.sh ${CI_BASE_BRANCH}
+        run ./dist/tools/licenses/check.sh ${CI_BASE_BRANCH} --diff-filter=MR --error-exitcode=0
+        run ./dist/tools/licenses/check.sh ${CI_BASE_BRANCH} --diff-filter=AC
+        run ./dist/tools/doccheck/check.sh ${CI_BASE_BRANCH}
+        run ./dist/tools/externc/check.sh ${CI_BASE_BRANCH}
 
         # TODO:
         #   Remove all but `${CI_BASE_BRANCH}` parameters to cppcheck (and remove second
         #   invocation) once all warnings of cppcheck have been taken care of
         #   in ${CI_BASE_BRANCH}.
-        ./dist/tools/cppcheck/check.sh ${CI_BASE_BRANCH} --diff-filter=MR --error-exitcode=0
-
-        ./dist/tools/cppcheck/check.sh ${CI_BASE_BRANCH} --diff-filter=AC
-
-        ./dist/tools/pr_check/pr_check.sh ${CI_BASE_BRANCH}
-
+        run ./dist/tools/cppcheck/check.sh ${CI_BASE_BRANCH} --diff-filter=MR --error-exitcode=0
+        run ./dist/tools/cppcheck/check.sh ${CI_BASE_BRANCH} --diff-filter=AC
+        run ./dist/tools/pr_check/pr_check.sh ${CI_BASE_BRANCH}
         exit $RESULT
     fi
 
@@ -79,11 +117,16 @@ then
     if [ "$BUILDTEST_MCU_GROUP" == "x86" ]
     then
         make -C ./tests/unittests all-debug test BOARD=native TERMPROG='gdb -batch -ex r -ex bt $(ELF)' || exit
+        set_result $?
         # TODO:
         #   Reenable once https://github.com/RIOT-OS/RIOT/issues/2300 is
         #   resolved:
         #   - make -C ./tests/unittests all test BOARD=qemu-i386 || exit
     fi
+
     BASE_BRANCH="${TRAVIS_BRANCH:-${CI_BASE_BRANCH}}"
     ./dist/tools/compile_test/compile_test.py $BASE_BRANCH
+    set_result $?
 fi
+
+exit $RESULT