some refractor:(