lots of enums and stuff