group caching; refactor events & observer