Changed abstract implementation structure to use interfaces.