replace observers with abstract_controller/callbacks