removes unnecessary abstraction
adds events capability