add abstract model class + refactoring