added hardware abstraction layer