Refactor receive() and progress()