refactor part1, complete part2
init commit for part 3