Experimental version with async