part 1 and 2 refactored a bit and complete