Tag watcher

This is another take on #66, which fixes merge conflicts.

Closes #66