diff --git a/Makefile b/Makefile
index fba5af6b..74d4fb76 100644
--- a/Makefile
+++ b/Makefile
@@ -2,6 +2,8 @@ UNAME=$(shell uname)
 DEBUG=1
 INSTALL=install
 MAKE=make
+GIT_VERSION=$(shell git describe --tags --always)
+VERSION=$(shell git describe --tags --abbrev=0)
 
 CFLAGS += -std=c99
 CFLAGS += -pipe
@@ -9,6 +11,7 @@ CFLAGS += -Wall
 CFLAGS += -Wunused
 CFLAGS += -Iinclude
 CFLAGS += -I/usr/local/include
+CFLAGS += -DI3_VERSION=\"${GIT_VERSION}\"
 
 LDFLAGS += -lm
 LDFLAGS += -lxcb-wm
@@ -16,7 +19,9 @@ LDFLAGS += -lxcb-wm
 LDFLAGS += -lxcb-xinerama
 LDFLAGS += -lX11
 LDFLAGS += -L/usr/local/lib -L/usr/pkg/lib
+
 ifeq ($(UNAME),NetBSD)
+# We need -idirafter instead of -I to prefer the system’s iconv over GNU libiconv
 CFLAGS += -idirafter /usr/pkg/include
 LDFLAGS += -Wl,-rpath,/usr/local/lib -Wl,-rpath,/usr/pkg/lib
 endif
@@ -33,13 +38,23 @@ else
 CFLAGS += -O2
 endif
 
+# Don’t print command lines which are run
+.SILENT:
+
+# Always remake the following targets
+.PHONY: install clean dist distclean
+
+# Depend on the object files of all source-files in src/*.c and on all header files
 FILES=$(patsubst %.c,%.o,$(wildcard src/*.c))
 HEADERS=$(wildcard include/*.h)
 
+# Depend on the specific file (.c for each .o) and on all headers
 src/%.o: src/%.c ${HEADERS}
+	echo "CC $<"
 	$(CC) $(CFLAGS) -c -o $@ $<
 
 all: ${FILES}
+	echo "LINK i3"
 	$(CC) -o i3 ${FILES} $(LDFLAGS)
 
 install: all
@@ -48,8 +63,20 @@ install: all
 	$(INSTALL) -m 0755 i3 $(DESTDIR)/usr/bin/
 	test -e $(DESTDIR)/etc/i3/config || $(INSTALL) -m 0644 i3.config $(DESTDIR)/etc/i3/config
 
+dist: clean
+	[ ! -f i3-${VERSION} ] || rm -rf i3-${VERSION}
+	[ ! -e i3-${VERSION}.tar.bz2 ] || rm i3-${VERSION}.tar.bz2
+	mkdir i3-${VERSION}
+	cp Makefile DEPENDS GOALS LICENSE PACKAGE-MAINTAINER TODO i3.config i3-${VERSION}
+	cp -r src include docs man i3-${VERSION}
+	tar cf i3-${VERSION}.tar i3-${VERSION}
+	bzip2 -9 i3-${VERSION}.tar
+	rm -rf i3-${VERSION}
+
 clean:
 	rm -f src/*.o
+	$(MAKE) -C docs clean
+	$(MAKE) -C man clean
 
 distclean: clean
 	rm -f i3
diff --git a/docs/Makefile b/docs/Makefile
index 276cc7ca..448cd68b 100644
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -2,3 +2,7 @@ hacking-howto.html: hacking-howto
 	asciidoc -n $<
 
 all: hacking-howto.html
+
+clean:
+	rm -f */*.{aux,log,toc,bm,pdf,dvi}
+	rm -f *.log *.html
diff --git a/man/Makefile b/man/Makefile
index cd977dd6..dec03897 100644
--- a/man/Makefile
+++ b/man/Makefile
@@ -1,2 +1,4 @@
 all:
 	a2x -f manpage --asciidoc-opts="-f asciidoc.conf" i3.man
+clean:
+	rm -f i3.xml i3.1 i3.html
diff --git a/src/mainx.c b/src/mainx.c
index 24e7d11c..bbd1efcd 100644
--- a/src/mainx.c
+++ b/src/mainx.c
@@ -340,17 +340,22 @@ int main(int argc, char *argv[], char *env[]) {
 
         application_path = sstrdup(argv[0]);
 
-        while ((opt = getopt(argc, argv, "c:")) != -1) {
+        while ((opt = getopt(argc, argv, "c:v")) != -1) {
                 switch (opt) {
                         case 'c':
                                 override_configpath = sstrdup(optarg);
                                 break;
+                        case 'v':
+                                printf("i3 version " I3_VERSION " © 2009 Michael Stapelberg and contributors\n");
+                                exit(EXIT_SUCCESS);
                         default:
                                 fprintf(stderr, "Usage: %s [-c configfile]\n", argv[0]);
                                 exit(EXIT_FAILURE);
                 }
         }
 
+        LOG("i3 version " I3_VERSION " starting\n");
+
         /* Initialize the table data structures for each workspace */
         init_table();