Split into modules for better maintenance