closes #4 #14 #9 #5 #6 #3