more readable and add some TODO