refactor
protocol