seprate impl