First commit, this is what I have so far and I haven't tested it yet.