finished abstraction layer