Refactor(2)(Still not finished yet)