#2 #3 #4 implemented