2.x/refactor

@Zeelot I simplified the models a lil bit (we don't need @property decorators if we have public properties) and added abstract classes.