updated using async