Part 1 Fully Implemented but not fully tested