changed abstract classes to interfaces