add a bunch of functionality and stuff