refactor change listeners