closes #33, closes #24, closes #28