put in a lot of functionality