Created by: reyoung
This method logic is a little bit complex, and need more comments for developers.