TODO: Refactor this mess