final version 3rd iteration