Large change set, apologies for not doing this incrementally, will do so in the future.
  See README.md for details.