refactor interfaces again