needs to by async; readability is worse though