closes #26, closes #27, closes #28