Reviewed interface and abstract classes and there implementations