async mostly working TODO: throws