diff --git a/bin/check_go_version b/bin/check_go_version
index 20fae7df5ed5e941da11e47132eb8651d03aa31a..ae789f9b689572a835e47ad22d8493cc41794c0e 100755
--- a/bin/check_go_version
+++ b/bin/check_go_version
@@ -23,55 +23,11 @@ GO_MIN_VERSION="$1"
 
 UPGRADE_MSG="Please take a look at https://golang.org/doc/install to install or upgrade go."
 
-die_upgrade() {
-    printf >&2 "fatal: %s\n" "$@"
-    printf >&2 "=> %s\n" "$UPGRADE_MSG"
-    exit 1
-}
-
-major_number() {
-    vers="$1"
-
-    # Hack around 'expr' exiting with code 1 when it outputs 0
-    case "$vers" in
-        0) echo "0" ;;
-        0.*) echo "0" ;;
-        *) expr "$vers" : "\([^.]*\).*" || return 1
-    esac
-}
-
-check_at_least_version() {
-    MIN_VERS="$1"
-    CUR_VERS="$2"
-    PROG_NAME="$3"
-
-    # Get major, minor and fix numbers for each version
-    MIN_MAJ=$(major_number "$MIN_VERS") || die "No major version number in '$MIN_VERS' for '$PROG_NAME'"
-    CUR_MAJ=$(major_number "$CUR_VERS") || die "No major version number in '$CUR_VERS' for '$PROG_NAME'"
-
-    if MIN_MIN=$(expr "$MIN_VERS" : "[^.]*\.\([^.]*\).*"); then
-        MIN_FIX=$(expr "$MIN_VERS" : "[^.]*\.[^.]*\.\([^.]*\).*") || MIN_FIX="0"
-    else
-        MIN_MIN="0"
-        MIN_FIX="0"
-    fi
-    if CUR_MIN=$(expr "$CUR_VERS" : "[^.]*\.\([^.]*\).*"); then
-        CUR_FIX=$(expr "$CUR_VERS" : "[^.]*\.[^.]*\.\([^.]*\).*") || CUR_FIX="0"
-    else
-        CUR_MIN="0"
-        CUR_FIX="0"
-    fi
-
-    # Compare versions
-    VERS_LEAST="$PROG_NAME version '$CUR_VERS' should be at least '$MIN_VERS'"
-    test "$CUR_MAJ" -gt $(expr "$MIN_MAJ" - 1) || die_upgrade "$VERS_LEAST"
-    test "$CUR_MAJ" -gt "$MIN_MAJ" || {
-        test "$CUR_MIN" -gt $(expr "$MIN_MIN" - 1) || die_upgrade "$VERS_LEAST"
-        test "$CUR_MIN" -gt "$MIN_MIN" || {
-            test "$CUR_FIX" -ge "$MIN_FIX" || die_upgrade "$VERS_LEAST"
-        }
-    }
-}
+# Get path to the directory containing this file
+# If $0 has no slashes, uses "./"
+PREFIX=$(expr $0 : "\(.*\/\)") || PREFIX='./'
+# Include the 'check_at_least_version' function
+. ${PREFIX}check_version
 
 # Check that the go binary exist and is in the path
 
diff --git a/bin/check_gx_program b/bin/check_gx_program
index 37ada6edc8bbc193d320aa2b1782808cfe8bc2ac..0c1b1f816b9e2297cb749678cf367724b3985ce0 100755
--- a/bin/check_gx_program
+++ b/bin/check_gx_program
@@ -27,55 +27,11 @@ GX_PROGRAM_NAME="$1"
 GX_MIN_VERSION="$2"
 UPGRADE_MSG="$3"
 
-die_upgrade() {
-    printf >&2 "fatal: %s\n" "$@"
-    printf >&2 "=> %s\n" "$UPGRADE_MSG"
-    exit 1
-}
-
-major_number() {
-    vers="$1"
-
-    # Hack around 'expr' exiting with code 1 when it outputs 0
-    case "$vers" in
-        0) echo "0" ;;
-        0.*) echo "0" ;;
-        *) expr "$vers" : "\([^.]*\).*" || return 1
-    esac
-}
-
-check_at_least_version() {
-    MIN_VERS="$1"
-    CUR_VERS="$2"
-    PROG_NAME="$3"
-
-    # Get major, minor and fix numbers for each version
-    MIN_MAJ=$(major_number "$MIN_VERS") || die "No major version number in '$MIN_VERS' for '$PROG_NAME'"
-    CUR_MAJ=$(major_number "$CUR_VERS") || die "No major version number in '$CUR_VERS' for '$PROG_NAME'"
-
-    if MIN_MIN=$(expr "$MIN_VERS" : "[^.]*\.\([^.]*\).*"); then
-        MIN_FIX=$(expr "$MIN_VERS" : "[^.]*\.[^.]*\.\([^.]*\).*") || MIN_FIX="0"
-    else
-        MIN_MIN="0"
-        MIN_FIX="0"
-    fi
-    if CUR_MIN=$(expr "$CUR_VERS" : "[^.]*\.\([^.]*\).*"); then
-        CUR_FIX=$(expr "$CUR_VERS" : "[^.]*\.[^.]*\.\([^.]*\).*") || CUR_FIX="0"
-    else
-        CUR_MIN="0"
-        CUR_FIX="0"
-    fi
-
-    # Compare versions
-    VERS_LEAST="$PROG_NAME version '$CUR_VERS' should be at least '$MIN_VERS'"
-    test "$CUR_MAJ" -gt $(expr "$MIN_MAJ" - 1) || die_upgrade "$VERS_LEAST"
-    test "$CUR_MAJ" -gt "$MIN_MAJ" || {
-        test "$CUR_MIN" -gt $(expr "$MIN_MIN" - 1) || die_upgrade "$VERS_LEAST"
-        test "$CUR_MIN" -gt "$MIN_MIN" || {
-            test "$CUR_FIX" -ge "$MIN_FIX" || die_upgrade "$VERS_LEAST"
-        }
-    }
-}
+# Get path to the directory containing this file
+# If $0 has no slashes, uses "./"
+PREFIX=$(expr $0 : "\(.*\/\)") || PREFIX='./'
+# Include the 'check_at_least_version' function
+. ${PREFIX}check_version
 
 # Check that the gx program exists
 
diff --git a/bin/check_version b/bin/check_version
new file mode 100755
index 0000000000000000000000000000000000000000..401471c3158fc78bbd063c9ae05ae054b495cb95
--- /dev/null
+++ b/bin/check_version
@@ -0,0 +1,77 @@
+#!/bin/sh
+
+if test "x$UPGRADE_MSG" = "x"; then
+    printf >&2 "fatal: Please set '"'$UPGRADE_MSG'"' before sourcing this script\n"
+    exit 1
+fi
+
+die_upgrade() {
+    printf >&2 "fatal: %s\n" "$@"
+    printf >&2 "=> %s\n" "$UPGRADE_MSG"
+    exit 1
+}
+
+major_number() {
+    vers="$1"
+
+    # Hack around 'expr' exiting with code 1 when it outputs 0
+    case "$vers" in
+        0) echo "0" ;;
+        0.*) echo "0" ;;
+        *) expr "$vers" : "\([^.]*\).*" || return 1
+    esac
+}
+
+check_at_least_version() {
+    MIN_VERS="$1"
+    CUR_VERS="$2"
+    PROG_NAME="$3"
+
+    # Get major, minor and fix numbers for each version
+    MIN_MAJ=$(major_number "$MIN_VERS") || die "No major version number in '$MIN_VERS' for '$PROG_NAME'"
+    CUR_MAJ=$(major_number "$CUR_VERS") || die "No major version number in '$CUR_VERS' for '$PROG_NAME'"
+
+    # We expect a version to be of form X.X.X
+    # if the second dot doesn't match, we consider it a prerelease
+
+    if MIN_MIN=$(expr "$MIN_VERS" : "[^.]*\.\([0-9]\+\)"); then
+        # this captured digit is neccessary, since expr returns code 1 if the output is empty
+        if expr "$MIN_VERS" : "[^.]*\.[0-9]*\([0-9]\.\|[0-9]\$\)" >/dev/null; then
+            MIN_PRERELEASE="0"
+        else
+            MIN_PRERELEASE="1"
+        fi
+        MIN_FIX=$(expr "$MIN_VERS" : "[^.]*\.[0-9]\+[^0-9]\+\([0-9]\+\)") || MIN_FIX="0"
+    else
+        MIN_MIN="0"
+        MIN_PRERELEASE="0"
+        MIN_FIX="0"
+    fi
+    if CUR_MIN=$(expr "$CUR_VERS" : "[^.]*\.\([0-9]\+\)"); then
+        # this captured digit is neccessary, since expr returns code 1 if the output is empty
+        if expr "$CUR_VERS" : "[^.]*\.[0-9]*\([0-9]\.\|[0-9]\$\)" >/dev/null; then
+            CUR_PRERELEASE="0"
+        else
+            CUR_PRERELEASE="1"
+        fi
+        CUR_FIX=$(expr "$CUR_VERS" : "[^.]*\.[0-9]\+[^0-9]\+\([0-9]\+\)") || CUR_FIX="0"
+    else
+        CUR_MIN="0"
+        CUR_PRERELEASE="0"
+        CUR_FIX="0"
+    fi
+
+    # Compare versions
+    VERS_LEAST="$PROG_NAME version '$CUR_VERS' should be at least '$MIN_VERS'"
+    test "$CUR_MAJ" -lt "$MIN_MAJ" && die_upgrade "$VERS_LEAST"
+    test "$CUR_MAJ" -gt "$MIN_MAJ" || {
+        test "$CUR_MIN" -lt "$MIN_MIN" && die_upgrade "$VERS_LEAST"
+        test "$CUR_MIN" -gt "$MIN_MIN" || {
+            test "$CUR_PRERELEASE" -gt "$MIN_PRERELEASE" && die_upgrade "$VERS_LEAST"
+            test "$CUR_PRERELEASE" -lt "$MIN_PRERELEASE" || {
+                test "$CUR_FIX" -lt "$MIN_FIX" && die_upgrade "$VERS_LEAST"
+                true
+            }
+        }
+    }
+}