observer pattern merged