reworked to async