rethink the interface from the bottom up