more abstraction and addition of a few extension points via observers