Split progress listener into its own class
Factor out transfer logic
Add put methods