better top level interface