todo: refine handle state change 2<->3