more of a mess, but working async