refactor the old upstreamAsync mechanism