improve observer
improve interface