abstract final version