some refactor
don't know