refact code
add features