This moves responsibility of generation to the calling code, removes it from the join strategies. It also enables using the end-strategy for the spikes