closes #21 closes #22 closes #24