done all but the optional stuff