TODO List:
- [ ] @JavierJia finish this TODO list
- [ ] @jakebiesinger clean up code
- [ ] @Nan-Zhang please fix this issue #4