diff --git a/common/scripts/lint-version-change b/common/scripts/lint-version-change
new file mode 100755
index 00000000000..5e968779938
--- /dev/null
+++ b/common/scripts/lint-version-change
@@ -0,0 +1,90 @@
+#!/bin/sh
+
+# when $3 is empty, template is read from working directory
+template="$1" base_rev="$2" tip_rev="$3"
+status=0
+
+die() {
+	printf '%s\n' "$*" >&2
+	exit 1
+}
+
+if ! [ "$base_rev" ]; then
+	die "usage: $0 TEMPLATE BASE-REVISION [TIP-REVISION]"
+fi
+
+if command -v chroot-git >/dev/null 2>&1; then
+	GIT_CMD=$(command -v chroot-git)
+elif command -v git >/dev/null 2>&1; then
+	GIT_CMD=$(command -v git)
+else
+	die "neither chroot-git nor git could be found"
+fi
+
+scan() {
+	rx="$1" msg="$2"
+	template_path=$template
+	if [ "$tip_rev" ]; then
+		template_path="${tip_rev}:${template}"
+		maybe_git="$GIT_CMD"
+		revspec="[^:]*:"
+	fi
+	$maybe_git grep -P -Hn -e "$rx" "$template_path" |
+		grep -v -P -e "[^:]*:[^:]*:\s*#" |
+		sed "s/^${revspec}\([^:]*:[^:]*:\)\(.*\)/\1 $msg/"
+}
+
+show_template() {
+	rev="$1"
+	if [ "$rev" ]; then
+		$GIT_CMD cat-file blob "${rev}:${template}" 2>/dev/null
+	else
+		cat "${template}" 2>/dev/null
+	fi
+}
+
+show_template_var() {
+	rev="$1" var="$2"
+	show_template "$rev" | grep -Po '^'${var}'=\K.*'
+}
+
+revision_reset() {
+	[ "${revision}" = 1 ] && return
+	if [ "$prev_version" ]; then
+		case "$prev_reverts" in
+			*"$version"_*) return
+		esac
+		action=update
+	else
+		action=creation
+	fi
+	scan "^revision=" "revision should be set to 1 on ${action}"
+	status=1
+}
+
+reverts_on_downgrade() {
+	[ "$version" ] || return
+	case "$reverts" in
+		*"$prev_version"_*) ;;
+		*)
+			scan "^version=" "missing reverts= for downgrade $prev_version to $version"
+			status=1
+	esac
+}
+
+version_change() {
+	version="$(show_template_var "$tip_rev" version)"
+	revision="$(show_template_var "$tip_rev" revision)"
+	reverts="$(show_template_var "$tip_rev" reverts)"
+	prev_version="$(show_template_var "$base_rev" version)"
+	prev_reverts="$(show_template_var "$base_rev" reverts)"
+	xbps-uhelper cmpver "$version" "$prev_version"
+	case "$?" in
+		1) revision_reset;;
+		-1|255) reverts_on_downgrade;;
+	esac
+}
+
+version_change
+
+exit $status
diff --git a/common/travis/xlint.sh b/common/travis/xlint.sh
index 753d4a1fa51..fc15d20a3fc 100755
--- a/common/travis/xlint.sh
+++ b/common/travis/xlint.sh
@@ -5,8 +5,10 @@
 [ "$XLINT" ] || exit 0 
 
 EXITCODE=0
+read base tip < /tmp/revisions
 for t in $(awk '{ print "srcpkgs/" $0 "/template" }' /tmp/templates); do
 	/bin/echo -e "\x1b[32mLinting $t...\x1b[0m"
 	xlint "$t" || EXITCODE=$?
+	common/scripts/lint-version-change "$t" $base $tip || EXITCODE=$?
 done
 exit $EXITCODE