add submodule
some refactor