user abstraction