TODO: 1-2
TODO 4-5, adjust the architecture