Closes #12 #7 #5 #3 #2