added addObserver, removeObserver