added engine abstraction