First run at the complete package. I'm sure there are some bugs