use URI observer instead Broadcast, and some refactoring