Should be complete, will add features as I go along in testing