Refactored to Observer/Observable pattern