covered most of the boilerplate stuff