initial async implementation