virtual: change code to be more understandable