step1: almost finished