abstract base classes added