Strict vocabularies

This is an initial PR - an initial pass at functionality is complete, but I didn't want to go too much further without comment.