Totally rewritten with reusability principles