Refactoring and add observer/able mode