Major rework - much more logical classes and impls