Use abstract models where possible

| Q                   | A
| ------------------- | ---
| Bug fix?            | N
| New feature?        | N
| BC breaks?          | N
| Tests pass?         | Y
| Scenarios pass?     | Y
| Checkstyle issues?  | N
| Changelog updated?  | N
| Fixed tickets       | ~
| Doc PR              | ~