These headers should only include general functionality, i.e. base classes and factory methods. Users working directly with derived types can include the relevant headers directly. Deprecate some top-level headers which are not really useful.