Technically complete! Needs tons of refactoring and some tests written.