move intermediates to separate module, use i/o data struct