adding device abstraction