Initial version

 Please review my code.
Fixed in 2b7b6b468e2dee503557632f5cbbaadf186ae1de commit.