design improvements with events model