finished the required and most of the optionals