rewrote interface code to be cleaner and use interfaces