spliced in more discriminator types
a lot more simplification