Functionally complete and factored (some new methods added). No bonus functions or data validation.