Basically finish all the work, need to test again