Added more abstractions and some impl draft.