add interfaces and some abstractions