written requirements (still with some TODOs)