complete solution with some nice ux