I intended for this to be mostly a refactoring PR with a more API-change heavy PR later. But I can add that in.