This closes #5, resolves #7, closes #15, Closes #17, resolves #20, Closes #21