can work now! but still have some TODO