Clearify execution path for each public function.

Handle all situations properly and fire corresponding events.