Developed for course SYSC4504 at Carleton University