introduce interface
decouple
minor changes
rename and move around
rename and move around