Generalized the requirements, re-organizing, formatting