469.event hooks revisited

This replaces #472. It addresses #469 and #473, and leaves #476 hanging for future reference.