closes #28, closes #12, closes #32