refactor services, rely more on events