Complete version. Waiting for user's feedback.