I have been working on this project for a bit so this first commit is pretty full.