Added the classes and the interfaces without doing anything to the enum types, because I am not sure how to make them work