partially reverts 6af02c3, adds less wrong ctrl_transfer abstraction