diff --git a/dist/tools/ci/build_and_test.sh b/dist/tools/ci/build_and_test.sh
index 898ff4787d80464346af88f26744d49f7b273846..c69f6e5e8558936642928a5518249e5ffb15a000 100755
--- a/dist/tools/ci/build_and_test.sh
+++ b/dist/tools/ci/build_and_test.sh
@@ -82,6 +82,7 @@ then
 
         run ./dist/tools/ci/print_toolchain_versions.sh
 
+        run ./dist/tools/commit-msg/check.sh ${CI_BASE_BRANCH}
         run ./dist/tools/whitespacecheck/check.sh ${CI_BASE_BRANCH}
         DIFFFILTER="MR" ERROR_EXIT_CODE=0 run ./dist/tools/licenses/check.sh
         DIFFFILTER="AC" run ./dist/tools/licenses/check.sh
diff --git a/dist/tools/commit-msg/check.sh b/dist/tools/commit-msg/check.sh
new file mode 100755
index 0000000000000000000000000000000000000000..f0dfef29c696b7a531ab3340e1d105c9655254c6
--- /dev/null
+++ b/dist/tools/commit-msg/check.sh
@@ -0,0 +1,48 @@
+#!/bin/sh
+
+# Copyright 2017 Freie Universität Berlin
+#
+# 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.
+
+MSG_MAX_LENGTH=50
+MSG_STRETCH_LENGTH=72
+
+# If no branch but an option is given, unset BRANCH.
+# Otherwise, consume this parameter.
+BRANCH="${1}"
+if echo "${BRANCH}" | grep -q '^-'; then
+    if [ $(git rev-parse --abbrev-ref HEAD) != "master" ]; then
+        BRANCH="master"
+    else
+        BRANCH=""
+    fi
+else
+    if [ -n "${BRANCH}" ]; then
+        shift 1
+    fi
+fi
+
+# select HEAD, if no branch is given
+if [ -z "${BRANCH}" ]; then
+    BRANCH=$(git rev-list HEAD | tail -n 1)
+fi
+
+ERROR="$(git log \
+    --no-merges --pretty=format:'%s' $(git merge-base ${BRANCH} HEAD)..HEAD | \
+    while read msg; do
+        msg_length=$(echo "${msg}" | awk '{print length($0)}')
+
+        if [ ${msg_length} -gt ${MSG_MAX_LENGTH} ]; then
+            echo "Commit message is longer than ${MSG_MAX_LENGTH} characters:" >&2
+            echo "    \"${msg}\"" >&2
+            if [ ${msg_length} -gt ${MSG_STRETCH_LENGTH} ]; then
+                echo "error"
+            fi
+        fi
+    done)"
+
+if [ -n "${ERROR}" ]; then
+    exit 1
+fi