cleanup: split into submodules