Event refactor

Just a thought...

(note: this depends on #145)
As mentioned offline, add a comment to say this is internal.