* Implement most of the methods * Some suggested changes and better error handling (that I then mask like Windows)