closes #8, #9, #2, #1