Split this module into various files for better organization