interfaces completely refactored to classes