refactor a lot
Merge origin/master
refactor a lot