second
some refactor