adding lots of stuff, cluding unit tests