cleaned up some interfaces and how to implement