Separated into separate files and headers for convenience