final version without final interface