Huge refactor w. breaking changes to support async