The third version, finished all functions, need to be tested
Merge remote-tracking branch 'origin/master'