Bunch of updates :P

- Refactor and extract common patterns
- Rename classes to have more meaningful names