updated abstraction