diff --git a/.gitignore b/.gitignore
index 6c303b0c2f04725e00fdfa2375f7f5a39879ef32..9d1dcd4b485d9eab75de956cb1b6f9a9fac372dd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -27,6 +27,7 @@ Makefile.in
 /build-aux/missing
 /run-test.sh
 /aclocal.m4
+/version
 /stamp.h
 /stamp-h1
 /stamp-h2
diff --git a/Makefile.am b/Makefile.am
index 1dfb0e6f4146c03e02e0d649b52e79a06ec97907..39f32d6a598bf918ac887a48f085cfd368aa361c 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -12,6 +12,7 @@ SUBDIRS = \
 ACLOCAL_AMFLAGS = -I m4
 
 EXTRA_DIST = \
+	version \
 	tests \
 	examples \
 	COPYING.LGPL \
@@ -225,3 +226,6 @@ test: all-am $(test_cases) $(failure_test_cases)
 test-plugins: all-am $(extprograms_test_cases)
 
 check: check-am test
+
+version:
+	$(AM_V_GEN)$(top_srcdir)/build-aux/git-version-gen > $@
diff --git a/build-aux/git-abi-version-gen b/build-aux/git-abi-version-gen
new file mode 100755
index 0000000000000000000000000000000000000000..f25ccd73329835e9800a066ae551f0117973ce1a
--- /dev/null
+++ b/build-aux/git-abi-version-gen
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+## serial 1
+
+if test "${VERSION}" != ""; then
+  VN=`echo ${VERSION} | sed -e "s/^\([0-9]*\.[0-9]*\)\.\([0-9]*\).*/\1.ABIv\2(${VERSION})/"`
+elif test -f version; then
+  VN=`cat version`
+  VN=`echo $VN | sed -e "s/^\([0-9]*\.[0-9]*\)\.\([0-9]*\).*/\1.ABIv\2($VN)/"`
+else test -d .git;
+  VN="0.0.ABIv0(0.0.0)"
+fi
+
+echo \"$VN\"
diff --git a/build-aux/git-tarname-version-gen b/build-aux/git-tarname-version-gen
new file mode 100755
index 0000000000000000000000000000000000000000..021cbd61f22255f8f6b3c199bebeb8cb681d086b
--- /dev/null
+++ b/build-aux/git-tarname-version-gen
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+## serial 1
+
+if test "${VERSION}" != ""; then
+  VN=`echo ${VERSION} | sed -e "s/^\([0-9]*\.[0-9]*\)\.\([0-9]*\).*/dovecot-\1-pigeonhole/"`
+elif test -f version; then
+  VN=`cat version`
+  VN=`echo $VN | sed -e "s/^\([0-9]*\.[0-9]*\)\.\([0-9]*\).*/dovecot-\1-pigeonhole/"`
+else
+  VN='dovecot-0.0-pigeonhole'
+fi
+
+echo $VN
diff --git a/build-aux/git-version-gen b/build-aux/git-version-gen
new file mode 100755
index 0000000000000000000000000000000000000000..ab736fa37d136ad507f469acac508fe5f9701f8e
--- /dev/null
+++ b/build-aux/git-version-gen
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+## serial 1
+
+if test "${VERSION}" != ""; then
+  VN="${VERSION}"
+elif test -s version; then
+  VN=`cat version`
+elif test -d .git; then
+ VN="0.0.0-`git rev-list --count HEAD`+`git describe --always`"
+ git update-index -q --refresh
+ test x = x"`git diff-index --name-only HEAD --`" || VN="${VN}-dirty"
+else
+  echo "Cannot determine version number">&2
+  exit 1
+fi
+
+echo $VN
diff --git a/configure.ac b/configure.ac
index 1aba7788ad4c668ae2a251f71d3d82bba1512f2a..d8ba11cacac8a294c0612f12a86f50b6daf38575 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,8 +1,17 @@
+m4_define([pigeonhole_VERSION],
+    m4_esyscmd_s([build-aux/git-version-gen]))))
+
+m4_define([pigeonhole_ABI_VERSION],
+    m4_esyscmd_s([build-aux/git-abi-version-gen]))))
+
+m4_define([pigeonhole_TAR_VERSION],
+    m4_esyscmd_s([build-aux/git-tarname-version-gen]))))
+
 AC_PREREQ([2.59])
 
 # Be sure to update ABI version also if anything changes that might require
 # recompiling plugins. Most importantly that means if any structs are changed.
-AC_INIT([Pigeonhole], [0.6.devel], [dovecot@dovecot.org], [dovecot-2.4-pigeonhole])
+AC_INIT([Pigeonhole], m4_defn([pigeonhole_VERSION]), [dovecot@dovecot.org], m4_defn([pigeonhole_TAR_VERSION]))
 AC_DEFINE_UNQUOTED([PIGEONHOLE_ABI_VERSION], "0.6.ABIv0($PACKAGE_VERSION)", [Pigeonhole ABI version])
 
 AC_CONFIG_SRCDIR([src])
diff --git a/version.in b/version.in
new file mode 100644
index 0000000000000000000000000000000000000000..a24f9877ac158c8e337bae149b7de338eb2b922b
--- /dev/null
+++ b/version.in
@@ -0,0 +1 @@
+@PACKAGE_VERSION@