This should conclude Part 1. Need to test, refactor, and test again.