Save some memory, fix some bugs, and allow overriding and canceling