add a bunch more functionality