Most of changes come from: 74bdd2e7ce and also refer few codes from: 872db4f11e
74bdd2e7ce
872db4f11e
1117623