We separated the structure (input-output flow) from the rest of the architecture and reworked some template programming to have better access to the types required at compile time.