This should all be pushed down to subclasses, I think, if the handling differs substantially. Having `id` as a type is odd.