The separation here isn't 100% clean yet, as there's common parts that are still protocol specific. We'll clean that up in the next commit.