major refactoring - using did<Event> to signal model updates instead