closes #1 #3 #4 #5 #6 #7 #8 #9 #11 #12 #14