apply colin's patch and refactor