Big refactoring, trying to implement OCP, ISP,...