#1 implemented
#7 implemented
#2 implemented
#4 implemented